当我用ViewController
推MapView
时,我需要画一条路线。这需要2秒,所以我想在另一个线程中进行此操作,因为我不想阻止UI。
我用过:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) ...
如果我在这里进行绘图,则需要10到15秒。
如果我使用performSelectorInBackground
方法,路线会在~1或2秒后出现。
为什么呢?我不应该PRIORITY_HIGH
禁食吗?
答案 0 :(得分:0)
你不应该在后台更新UI,真的发生任何事情。您使用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...
方法实现一次,您应该注意到时间上没有差异。