gpt4 book ai didi

iOS 多线程 - NSURLSession 和 UI 更新

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:15 24 4
gpt4 key购买 nike

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

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

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

图像几乎是即时下载的,但是表格 View 需要 10-20 秒才能更新!需要说明的是,更新委托(delegate)甚至没有被调用持续 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/

关于iOS 多线程 - NSURLSession 和 UI 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29315412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com