ios - 如何更改 Void 函数内部变量的值?

标签 ios iphone swift function

我有一个函数

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/

相关文章:

iphone - 将国家代码转换为国家名称

iphone - 用户界面在加载时卡住并且应用程序经常崩溃

python - 导入错误 : cannot import name csrf_exemp

ios - 在 SDK 谷歌地图中快速绘制多边形/形状

ios - Realm 迁移,初始化位置

ios - Admob 未显示在 ViewController 中

ios - 如何设置 UIBarButtonItem 的字体大小?

ios - ViewController 不访问您的元素

iphone - 在 ios4 上以编程方式将 caf 文件转换为 m4r

swift - 'valueForKeyPath:' 函数不支持