dispatch_async和peformSelectorInBackground之间的区别

时间:2013-01-09 20:41:27

标签: ios objective-c asynchronous

当我用ViewControllerMapView时,我需要画一条路线。这需要2秒,所以我想在另一个线程中进行此操作,因为我不想阻止UI。

我用过:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) ...

如果我在这里进行绘图,则需要10到15秒。

如果我使用performSelectorInBackground方法,路线会在~1或2秒后出现。

为什么呢?我不应该PRIORITY_HIGH禁食吗?

1 个答案:

答案 0 :(得分:0)

你不应该在后台更新UI,真的发生任何事情。您使用dispatch_asyncperformSelectorInBackground:时应该花费大约相同的时间来处理您的数据。您遇到的时间差异是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...方法实现一次,您应该注意到时间上没有差异。