5

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

我用了:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) ...

如果我在这里画图,大约需要 10 到 15 秒。

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

为什么?不PRIORITY_HIGH应该快吗?

4

1 回答 1

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...方法实现一次此模式,您应该注意到时间没有差异。

于 2013-01-13T14:30:23.397 回答