我有这个代码,我想用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()){ ... }
来更改标签的内容?
答案 0 :(得分:2)
iOS的原则:您只有一个可以修改UI的线程。它叫做UI线程。每当您想要更改UI内容时,必须在UI线程中调用所有更改UI内容的函数。在您的情况下,处理程序在后台线程中执行,因此您必须将self.label.text = "SOME_TEXT"
放在UI线程中。
答案 1 :(得分:1)
这是GUI编程中非常常见的模式。
基本上,主消息循环运行单线程,而无需同步所有内容。这意味着如果你想与你的窗口进行交互,你需要在主GUI线程上进行 - 这就是调度的作用,它在消息队列上发布一条消息,循环解释它,将你的代码放在它的线程上。 / p>
这既简单又有表现。