我有一个关于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完全关闭吗,还是类似于寻找大质数或挖掘比特币那样的操作?由于我对多线程的了解有限,所以对于未来的参考,任何关于这种情况的见解都将非常有帮助。