我有一个dataTask进行webservice API调用,并在该dataTask的完成块中,我使用返回的信息来构建UIImageView并将其添加为父UIViewController的子视图。我已经尝试了两个API调用,我想知道为什么一个导致UIImageView显示比另一个慢得多。在完成块内部,快速调用(不到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的完成块中运行。
有人可以详细解释为什么同一功能的这两个调用具有明显不同的运行长度吗?
答案 0 :(得分:1)
当这些调用更新UI时,您的第一个调用是main thread
,它会立即更新您的imageView。但是您的第二个调用直接位于dataTask
完成处理程序中,该处理程序通常在辅助线程运行循环上运行,因此此调用
(self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
在secondary thread runloop
上运行,因此无法更新用户界面。当其他一些电话或其他一些事件重新加载UIImageView
时,会显示您计算的image
以显示在UIImageView
上。
因为如果你的调用直接在完成处理程序中,dataTask
获取辅助线程上的数据,而不是更新辅助线程上的imageView
,因为所有UI都必须在{{{ 1}}。将main thread
更新置于imageView
。