下载网页内容后快速更改标签文本

时间:2015-03-23 21:36:22

标签: ios swift

我有这个代码,我想用web中的文本更改标签的内容

var url = NSURL(string: "SOME_URL");
var task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: {
(data, response, error) -> Void in


if error == nil {
self.label.text = "SOME_TEXT" // not working

dispatch_async(dispatch_get_main_queue()){
     self.label.text = "SOME_TEXT" // working
     }

}
else{
    println("Error")
}

})

task.resume()

为什么我必须使用dispatch_async(dispatch_get_main_queue()){ ... }来更改标签的内容?

2 个答案:

答案 0 :(得分:2)

iOS的原则:您只有一个可以修改UI的线程。它叫做UI线程。每当您想要更改UI内容时,必须在UI线程中调用所有更改UI内容的函数。在您的情况下,处理程序在后台线程中执行,因此您必须将self.label.text = "SOME_TEXT"放在UI线程中。

答案 1 :(得分:1)

这是GUI编程中非常常见的模式。

基本上,主消息循环运行单线程,而无需同步所有内容。这意味着如果你想与你的窗口进行交互,你需要在主GUI线程上进行 - 这就是调度的作用,它在消息队列上发布一条消息,循环解释它,将你的代码放在它的线程上。 / p>

这既简单又有表现。