バックグラウンドで同時に動作させたくない場合は、シリアル キューが必要です。シリアル GCD キューを作成するには:
dispatch_queue_t queue = dispatch_queue_create("com.appsdev.project1", 0);
そして、そのキューに何かを追加するたびに、それは単純です:
dispatch_async(queue, ^{
// do your background stuff
dispatch_async(dispatch_get_main_queue(), ^{
// update the UI
});
});
使いたい場合は、NSOperationQueue
実質的に簡単です:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;
そして、そのシリアル キューに操作を追加するには:
[queue addOperationWithBlock:^{
// do your stuff
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// update the UI
}];
}];
そして、あなたのNSThread
質問に答えて、あなたが説明したことに基づいて、その必要はないと思います. 確かに、目に見えるパフォーマンスの問題はありません。
ところで、ディスパッチ/オペレーション キューに追加しているものは、同期的に動作することが保証されていますか (つまり、ジオコーディングなど、それ自体が非同期的に動作するようなことを行っていませんか?)。非同期で動作する場合は、さらに注意が必要です。
ところで、操作キューを使用して最新の場所のみを気にする場合は、次の呼び出しによって、まだ開始されていない他の操作をキャンセルする機会も必要です。
[queue cancelAllOperations];
進行中の操作が最初に完了します (キャンセルされたかどうかをテストするコードを挿入しない限り) が、まだ開始されていない保留中の操作は、最新の場所に基づいて新しい要求を開始する前に簡単にキャンセルできます。すべてのロケーション要求を連続して処理したいのか、進行中のリクエストを終了して他のリクエストをクリアし、新しいロケーションに基づいて新しい操作をキューに入れたいのかによって異なります。アプリが何を必要としているかによって異なりますが、多くの場合、現在の場所だけを気にします。これにより、キューが滞りすぎないようにすることができます。