我有一个函数
public func lastActivityFor(userName: String) -> String {
var lastSeenInfo = "date"
OneLastActivity.sendLastActivityQueryToJID((userName), sender: OneChat.sharedInstance.xmppLastActivity) { (response, forJID, error) -> Void in
if let timeInSeconds = response?.lastActivitySeconds() {
let time: NSNumber = NSNumber(unsignedLong: timeInSeconds)
switch timeInSeconds {
case 0:
lastSeenInfo = "online"
case _ where timeInSeconds > 0 && timeInSeconds < 60:
lastSeenInfo = "last seen \(timeInSeconds) seconds ago"
case _ where timeInSeconds > 59 && timeInSeconds < 3600:
lastSeenInfo = "last seen \(timeInSeconds / 60) minutes ago"
case _ where timeInSeconds > 3599 && timeInSeconds < 86400:
lastSeenInfo = "last seen \(timeInSeconds / 3600) hours ago"
case _ where timeInSeconds > 86399:
let date = NSDate(timeIntervalSinceNow:-time.doubleValue)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
lastSeenInfo = "last seen on \(dateFormatter.stringFromDate(date))"
default:
lastSeenInfo = "never been online"
}
}
}
return lastSeenInfo
}
但是完成后,我的 lastSeenInfo
变量没有改变,仍然等于“日期”。
当我从我的其他文件中调用它时:
print(OneLastActivity.sharedInstance.lastActivityFor("username_here"))
它打印
date
last seen some time ago
所以它在我看来是异步工作的。我该如何解决?但我想在没有 dispatch_async
的情况下修复它。如何在不触及嵌套函数和 -> Void
部分的情况下修改我的函数?
最佳答案
我认为问题在于请求/响应本质上是异步的。在结果完成之前返回旧值。
两种解决方案: 要么使变量成为类实例并对其进行变异。使其无效返回。 或者 等待区 block 完成,但从设计的角度来看,这是有风险且不明智的做法
为什么不拥有一个类实例并使用 didSet 方法呢? 在你的类(class)( View Controller ?)
public func lastActivityFor(userName: String) {
OneLastActivity.sendLastActivityQueryToJID((userName), sender: OneChat.sharedInstance.xmppLastActivity) { (response, forJID, error) -> Void in
if let timeInSeconds = response?.lastActivitySeconds() {
let time: NSNumber = NSNumber(unsignedLong: timeInSeconds)
switch timeInSeconds {
case 0:
self.lastSeenInfo = "online"
case _ where timeInSeconds > 0 && timeInSeconds < 60:
self.lastSeenInfo = "last seen \(timeInSeconds) seconds ago"
case _ where timeInSeconds > 59 && timeInSeconds < 3600:
self.lastSeenInfo = "last seen \(timeInSeconds / 60) minutes ago"
case _ where timeInSeconds > 3599 && timeInSeconds < 86400:
self.lastSeenInfo = "last seen \(timeInSeconds / 3600) hours ago"
case _ where timeInSeconds > 86399:
let date = NSDate(timeIntervalSinceNow:-time.doubleValue)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
self.lastSeenInfo = "last seen on \(dateFormatter.stringFromDate(date))"
default:
self.lastSeenInfo = "never been online"
}
}
}
}
var lastSeenInfo:NSDate? {
didSet {
//update display or something
}
}
关于ios - 如何更改 Void 函数内部变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140100/