8

我有一个小问题,让我从代码开始

class ViewController: UIViewController {

@IBOutlet weak var LBoutput: UILabel!
@IBAction func BTclick(sender: AnyObject) {
    var url = NSURL(string: "http://google.com")
    println("test0")
    let getdata = NSURLSession.sharedSession().dataTaskWithURL(url){(data ,response , error) in
        var htmlContent = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("test1")
        println("test2")
        self.LBoutput.text = "test6"
    }
    println("test3")
    getdata.resume()
    println("test4")
    LBoutput.text = "test5"

}

这段代码在控制台中给了我一个输出

测试0
测试
3测试4
测试1 测试
2

标签也立即更新为“test5”,但更新为“test6”的标签需要 30 秒。

我不知道为什么这需要这么长时间,有人知道吗?

4

2 回答 2

32

在辅助线程中更新 UI 的常见问题:

您的闭包显然没有在主线程上运行,因为 URL 任务是异步的。所以更新闭包上的标签将不得不等待主线程运行它的更新循环。修复它的方法是包装.text =调用以强制它在主线程上运行(这是 UI 东西无论如何都应该运行的地方):

        dispatch_async(dispatch_get_main_queue()) {
            self.LBoutput.text = "test6"
        }
于 2014-09-01T10:35:47.260 回答
0

在斯威夫特 3 中:

DispatchQueue.main.async
{
    self.LBoutput.text = "test6"
}
于 2017-06-16T02:09:40.600 回答