iOSmultithreading – NSURLSession和UI更新

我在iOS有一个关于multithreading的一般问题:

在我非常简单的testing应用程序中,我使用NSURLSession从服务器下载一些小图像并将它们呈现在表格视图中。 在NSURLSession的callback中,在检索图像之后,我调用tableview.reloadData(),如下所示:

var session = NSURLSession.sharedSession().dataTaskWithURL(NSURL(url)) {(data, response, error) -> Void in /* Process images here */ self.tableView.reloadData() } session.resume() 

图像几乎是即时下载,但需要10-20秒才能更新表格视图! 要清楚的是,更新代表甚至没有被调用 10-20秒。 但是,如果我将reloadData()放在主线程上,它会很快更新。 像这样:

 var session = NSURLSession.sharedSession().dataTaskWithURL(NSURL(url)) {(data, response, error) -> Void in /* Process images here */ dispatch_async(dispatch_get_main_queue()) { self.tableView.reloadData() } } session.resume() 

所以,我的问题解决了,我可以再睡一会了。 但有人可以向我解释为什么是这样吗? 我知道UI更新应该在主线程中执行 – 那么为什么第一个案例实际上仍然可以工作,但是还是需要FOREVER来完成呢? 应用程序中没有任何其他的事情,所以我甚至不能开始思考什么可能会阻止整个20秒重新加载。 它是否等待NSURLSession首先完全closures,或者沿着这些线? 寻找大素数? 挖掘比特币?

我对multithreading的知识是有限的,所以对这种情况的任何了解对于将来的参考都是非常有帮助的。

我们不更新任何主线以外的用户界面,因为它会导致死锁。 这里可能发生的情况是有10-20秒的死锁,并在此之后释放死锁。

在另一个线程上更新UI并不总是行不通的。 你所经历的是许多结果之一。 我们不能真正的知道cocoa底下发生了什么,所以我们不能真正知道。

只要总是在主线程上更新你的用户界面,以避免这种奇怪的行为。

https://chritto.wordpress.com/2012/12/20/updating-the-ui-from-another-thread/