iOS label does not update text with function in Sw

2019-02-22 03:52发布

This question already has an answer here:

This seemingly simple issue is driving me crazy... I am playing around with SwiftyJSON to grab remote data and here is a snippet from my ViewController class in Swift:

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
    }

}

The statusLabel text is set to "welcome" but does not change afterwards. Funny though, anything I put inside func getMostRecentStatusUpdate(_:) with println() is printed to the console correctly, even if it comes from the remote json source (i.e. I know that this function works). My problem is that I cannot get the text printed to a UILabel instead of the console. I do not get any error messages.

I am not yet really familiar with the sort of Swift function like MyClass.myMethod { (myData) -> Void in .... } and I don't understand what's going wrong here. Any ideas?

1条回答
何必那么认真
2楼-- · 2019-02-22 04:37

UIKit is not thread safe and should only be updated from the main thread. Downloads are done on background thread, and you cannot update UI from there. Try:

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
        }
    }
}
查看更多
登录 后发表回答