3

非同期メソッドがありますlongRunningMethodOnObject:completion:

このメソッドは、「オブジェクト」タイプのオブジェクトを受け取ります。そのデータを処理してから、完了ハンドラを呼び出します。

さまざまな「longRunningMethods」を呼び出して、すべてが完了するまで待つ必要があります。

「for」ループ内で、すべての「longRunningMethodOnObject」を互いに非同期 (並列) に実行したいと考えています。(「longRunningMethodOnObject」が互いに連続して実行されるかどうかはわかりませんが、これは一般的な質問です)

適切なセマフォを作成したかどうか確信が持てず、それらの間で同期する適切な方法についての説明をいただければ幸いです。

ラッパー関数のコードは次のとおりです。

-(void)applyLongRunningOperationOnObjectInArray:(NSArray *)theObjects completion:(completion)block
{
// offsetting to worker thread in my object
  dispatch_async(self.myQueue,^{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //Not sure if this should be here or in the for loop
    for(Object *ob in theObjects)
    {
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // the semaphore for the "for" loop - should this be here? or above the for loop
      [GlobalObject longRunningMethodOnObject:ob completion:^{ // would like each call to be independant of previous call in for loop
        dispatch_semaphore_signal(semaphore); // signaling that it completed
      }];
    }
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // would like to wait here for each semaphore 
    block(); // invoke the completion handler
  });
}
4

1 に答える 1

10

この場合に使用できると思いますがdispatch_semaphore、ディスパッチ グループを使用すると、アプリケーション ロジックがより単純になる可能性があります。

NSArray *theObjects = @[@"Apple",@"Orange",@"Peach"];
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t _myQueue = dispatch_queue_create("com.cocoafactory.DispatchGroupExample",
                                                      0);
for( id ob in theObjects ) {
    dispatch_group_async(group, _myQueue, ^{
        //  do some long running task.
    });
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

//  now do whatever should be done after
//  all of your objects are processed
//  in your case block()

このトピックについては、Concurrency Programming Guideを参照してください。「キューに入れられたタスクのグループを待機中」まで下にスクロールします

タスクがキューで同時に実行されるかどうかについての質問に答えるには、状況によって異なります。上記の例で_myQueueは、 はシリアル キューです。グローバル名前付きキューは並行しています。DISPATCH_QUEUE_CONCURRENTiOS 5 以降、キュー タイプで同時キューを作成することもできます。

于 2013-10-19T11:02:38.027 に答える