我有一个进行 web 服务 API 调用的 dataTask,在该 dataTask 的完成 block 中,我使用返回的信息构建 UIImageView 并将其添加为父 UIViewController 的 subview 。我已经尝试了两个 API 调用,我想知道为什么一个会导致 UIImageView 的显示速度比另一个慢得多。在完成 block 内部,不到 1 秒的快速调用是:
dispatch_async(dispatch_get_main_queue(), {
(self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
});
而较慢的调用(大约需要 13 秒)是:
(self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
第一个显然在主队列上运行,但我不太确定第二个,因为它直接在 dataTask 的完成 block 中运行。
有人可以详细解释为什么同一函数的这两个调用具有如此明显不同的运行长度吗?
当这些调用更新 UI 时,您的第一个调用是在 main thread
上,它会立即更新您的 imageView。但是您的第二个调用直接在 dataTask
完成处理程序中进行,通常在辅助线程运行循环所以这个调用
(self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
hiện hữu secondary thread runloop
上运行,因此它将无法更新 UI。当其他一些调用或其他事件重新加载 UIImageView
时,它会显示您计算出的 hình ảnh
以显示在 UIImageView
上。
因此,如果您的调用直接在完成处理程序中,那么 dataTask
会在辅助线程上获取数据,而不是在辅助线程上更新您的 imageView
,这不应该像所有 UI 那样完成必须在 main thread
上更新。将 imageView
更新放在 main thread
上。
Tôi là một lập trình viên xuất sắc, rất giỏi!