我有一个关于iOS中多线程的一般问题:
在我非常简单的测试应用程序中,我使用NSURLSession从服务器下载一些小图像并将它们呈现在表格视图中.在NSURLSession的回调中,在检索图像之后,我像这样调用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更新应该在主线程上执行 – 那么为什么第一个案例实际上仍然可以工作,但是要永远这样做呢?应用程序中没有其他任何内容,所以我甚至无法开始考虑什么可以阻止重新加载整整20秒.它是在等待NSURLSession先完全关闭,还是沿着这些线路?寻找大素数?挖掘比特币?
我对多线程的了解有限,因此对这种情况的任何见解都将对将来的参考非常有帮助.
最佳答案 我们不会在除main之外的任何线程中更新UI,因为它会导致死锁.这里可能发生的事情是,有一个10-20秒的死锁,在那之后有些东西会释放死锁.
并不是在另一个线程上更新UI总是不起作用.您所经历的是众多成果之一.我们无法真正告诉Cocoa下面发生了什么,所以我们真的不知道.
只需在主线程上更新UI,以避免出现类似的奇怪行为.
https://chritto.wordpress.com/2012/12/20/updating-the-ui-from-another-thread/