2

標準の位置情報サービスを使用して、位置情報の更新が通知されるたびにネットワーク呼び出しを含む処理を実行する必要があります。デバイスの追跡を維持し、可能な限り迅速に結果を取得するために、FIFO の順序で処理される位置情報の更新が必要です。ロケーションが順番に処理され、処理がオーバーラップしないようにするための最良の方法または手法は何ですか (さらに、高速な応答を得るために): 操作キュー、ディスパッチ キュー、またはスレッドを直接 (存在する場合は別の方法でも) ? オペレーションキューもディスパッチキューも性能的にはほとんど変わらないように見えますが、ディスパッチキューの方が扱いやすいようで、それぞれのメリットがわかりません。スレッドに関しては、通常は使用しないように勧められてきましたが、使用していません。

前もって感謝します

4

1 に答える 1

1

バックグラウンドで同時に動作させたくない場合は、シリアル キューが必要です。シリアル 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];

進行中の操作が最初に完了します (キャンセルされたかどうかをテストするコードを挿入しない限り) が、まだ開始されていない保留中の操作は、最新の場所に基づいて新しい要求を開始する前に簡単にキャンセルできます。すべてのロケーション要求を連続して処理したいのか、進行中のリクエストを終了して他のリクエストをクリアし、新しいロケーションに基づいて新しい操作をキューに入れたいのかによって異なります。アプリが何を必要としているかによって異なりますが、多くの場合、現在の場所だけを気にします。これにより、キューが滞りすぎないようにすることができます。

于 2013-02-23T21:57:07.747 に答える