5

で を押すViewControllerMapView、ルートを描く必要があります。これには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_asyncか、または処理する必要があるかどうか。performSelectorInBackground:経験している時間の違いは、GUI がバックグラウンドで何かが変更されたことを認識するのにかかる時間です。なぜこれがこれら 2 つの方法で異なるのか説明できません。これは文書化されていない実装の詳細です。

これを処理する正しい方法は、バックグラウンドでデータを処理した後、メイン スレッドにコールバックして 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 で 1 回、performSelector...メソッドで 1 回実装してみてください。時間に違いはありません。

于 2013-01-13T14:30:23.397 に答える