iOS标签不会在Swift中使用函数更新文本

时间:2015-01-08 13:25:56

标签: ios swift uiviewcontroller uilabel

这个看似简单的问题让我发疯了...我正在玩SwiftyJSON来获取远程数据,这里是我在Swift中的ViewController类的片段:

override func viewDidLoad() {
    super.viewDidLoad()

    self.statusLabel.text = "welcome"

    RemoteDataManager.getStatusUpdateFromURL { (statusData) -> Void in
        let json = JSON(data: statusData)
        self.statusLabel.text = "this does not work"
        self.statusLabel.text = self.getMostRecentStatusUpdate(json) // also does not work
    }

}

statusLabel文本设置为" welcome"但之后不会改变。有趣的是,我放在func getMostRecentStatusUpdate(_:) println() MyClass.myMethod { (myData) -> Void in .... }内的任何内容都正确打印到控制台,即使它来自远程json源(即我知道这个功能有效)。我的问题是我无法将文本打印到UILabel而不是控制台。我没有收到任何错误消息。

我还不熟悉像{{1}}那样的Swift函数,我不明白这里出了什么问题。有什么想法吗?

1 个答案:

答案 0 :(得分:23)

UIKit不是线程安全的,只能从主线程更新。下载是在后台线程上完成的,您无法从那里更新UI。尝试:

override func viewDidLoad() {
    super.viewDidLoad()

    self.statusLabel.text = "welcome"

    RemoteDataManager.getStatusUpdateFromURL { (statusData) -> Void in
        let json = JSON(data: statusData)

        dispatch_async(dispatch_get_main_queue()) {
            self.statusLabel.text = "this does not work"
            self.statusLabel.text = self.getMostRecentStatusUpdate(json) // also does not work
        }
    }
}