当我推送一个带有 MapView
的 ViewController
时,我需要绘制一条路线。这需要大约 2 秒,所以我想在另一个线程中进行,因为我不想阻塞 UI。
我用过:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) ...
如果我在这里画画,大约需要 10 - 15 秒。
如果我使用 performSelectorInBackground
方法,路线将在约 1 或 2 秒后出现。
为什么? PRIORITY_HIGH
不应该很快吗?
最佳答案
你不应该在后台更新用户界面,真的任何事情都有可能发生。无论您使用 dispatch_async
还是 performSelectorInBackground:
都应该花费大约相同的时间来处理您的数据。您遇到的时间差异是 GUI 需要多长时间才能注意到后台发生了某些变化。我无法解释为什么这两种方法不同,这是一个未记录的实现细节。
正确的处理方式是在后台处理完数据后回调主线程更新你的UI。使用 GCD,这可能看起来像这样:
dispatch_queue_t queue = dispatch_get_global_queue( 0, 0 );
dispatch_async( queue, ^{
id result = [self doExpensiveCalculation];
dispatch_async( dispatch_get_main_queue(), ^{
[self updateUIWithResult: result];
} );
} );
尝试使用 GCD 和 performSelector...
方法一次实现此模式,您应该注意到时间上没有差异。
关于ios - dispatch_async 和 peformSelectorInBackground 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246069/