iOS 多线程 - NSURLSession 和 UI 更新

iOS Multithreading - NSURLSession and UI updates

我有一个关于 iOS 中多线程的一般性问题:

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

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

图像几乎是瞬间下载,但是 table 视图需要 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 更新应该在主线程上执行 - 那么为什么第一种情况实际上仍然有效,但需要永远去做呢?应用程序中没有其他任何事情发生,所以我什至无法开始思考是什么导致重新加载整整 20 秒。它是在等待 NSURLSession 先完全关闭,还是类似的事情?寻找大质数?开采比特币?

我对多线程的了解有限,所以对这种情况的任何见解都对以后的参考非常有帮助。

我们不会在主线程以外的任何线程中更新 UI,因为它会导致死锁。这里可能发生的是死锁持续 10 到 20 秒,之后某些东西释放了死锁。

并不是说在另一个线程上更新UI总是不行。你所经历的只是众多结果之一。我们无法真正知道 Cocoa 下面发生了什么,所以我们无法真正知道。

请始终在主线程上更新您的 UI 以避免出现类似的奇怪行为。

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