複数の非同期 Web 呼び出しを処理する際のベスト プラクティスは何ですか。
シナリオ:
1 つの Web サービスの JSON フィードから大量の住所リストを取得し、CLGeocoder に住所文字列からの緯度/経度検索を照会しています。次に、両方の情報を取得したら、アクションを実行したいと思います。
リンクされたチェーンですべてのメソッドを結合せずにこれを行う最良の方法は何ですか?
複数の非同期 Web 呼び出しを処理する際のベスト プラクティスは何ですか。
シナリオ:
1 つの Web サービスの JSON フィードから大量の住所リストを取得し、CLGeocoder に住所文字列からの緯度/経度検索を照会しています。次に、両方の情報を取得したら、アクションを実行したいと思います。
リンクされたチェーンですべてのメソッドを結合せずにこれを行う最良の方法は何ですか?
新しい を作成し、NSOperationQueue
必要な数のスレッドを持つように構成してから、そのスレッドで操作を開始することをお勧めします。それらが完了するのを待つには、単にwaitUntilAllOperationsAreFinished
メソッドを呼び出します。
例えば:
NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];
// Add your tasks here
[operationQueue addOperationWithBlock:^{
// Long running task
}];
[operationQueue waitUntilAllOperationsAreFinished];
メイン スレッドをブロックしないように注意してください。ブロックしないと、ロード中にアプリケーションが応答しなくなります。
これより複雑なものが必要な場合は、下位レベルの API を使用dispatch_group_t
してスレッドをグループ化し、それらを待つことができます。詳細については、この応答をご覧ください。
上記の方法では不十分な場合があります。これはおそらく、既に非同期のタスク (GPS を有効にしたり、外部イベントを待機するなど) を待機する必要があるためです。このような場合、セマフォを使用できます。エラー処理とセマフォには細心の注意を払う必要があります。そうしないと、スレッドが永久にブロックされる可能性があります。
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[object performLongOperationAndDo:^{
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
Obj-C セマフォに関する詳細情報。
必要がない限り、私はに固執しNSOperationQueue
ます。
多分あなたはこれが役に立つと思うでしょう: Reactive Cocoa
あなたのタイプの問題に対する本当にエレガントなソリューションです。フレームワークの学習曲線は非常に急勾配です。