1

Grand Central Dispatchを使用してタスクを完了するための特定の順序を強制しようとしていますが、正しい方法を理解するのに少し問題があります。私は、次の方法でグループを使用してみました:GCDを使用して状態を待つ

初期化:待機する必要が

startup = dispatch_group_create(); 

タスク:私は待つ必要がある

//Don't want to wait on the main thread, so dispatch async to a concurrent queue 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0L),^{ 
     //Wait until we're finished starting up 
     dispatch_group_wait(startup,DISPATCH_TIME_FOREVER); 
     //Now we can do this stuff back on the main queue 
     dispatch_async(dispatch_get_main_queue(),^{ 
      //Do work 
     }); 
    }); 

が仕事:

dispatch_group_async(startup,dispatch_get_main_queue(),^{ // work }); 

私のアプリの性質上、待つ必要がある作業は、待つ必要のある作業の前に行うことができます。私が本当に望むのは、条件が完了した時点でそれが完了し、将来のすべてのスレッドがそれらのことを行うことができるという条件を待つ能力です。 GCDにはこれがありますか?

答えて

0

私がセマフォを使用して、waitの各呼び出しの後に信号を送ると動作します。 dispatch_group_enterとdispatch_group_leaveを呼び出す場合にも機能します。

2

あなたの実装の詳細がすべてわからないので、私があなたがすでに知っていることを繰り返すなら、私を許してください。

  1. ディスパッチグループのシリアルキューへ
  2. 使用dispatch_group_asyncを作成します。シリアルキューを使用することで、タスクは望む順序で処理されることが保証されます。注文が問題ではないが、あなたの質問が特定の順序で完了しなければならないと言った場合、同時キューを使用してください。
  3. すべてのタスクのディスパッチが完了したら、dispatch_group_notifyを使用します。グループに割り当てられたすべてのタスクの処理が完了したら、指定したキューのブロックが実行されます。特定の構文解析の活動のために

    dispatch_group_notify(startup, dispatch_get_main_queue(), ^{ 
         // Don't forget to release the dispatch group! 
         dispatch_release(startup) 
        // perform work block; 
    }); 
    

、私は、構文解析の活動の残りの進行中に行うことができるデータのいくつかの処理を行う必要があります。私は、並列キュー上のグループに処理を割り当てます。私の解析が終わると、グループが完了したかどうかをチェックします。それが完了したら、私は物事をきれいにする。そうでない場合は、dispatch_group_notify()を利用して後で作業を実行します。これらの行に沿ったもの:

double delayInSeconds = 2.0; 
dispatch_time_t groupWaitTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
if (dispatch_group_wait(myDispatchGroup, groupWaitTime)==0){ 
    NSLog(@"dispatch group completed in time"); 
    dispatch_release(myDispatchGroup); 
    [self parsingCompleteWithActivity:activity]; 
}else{ 
    NSLog(@"dispatch group did not complete in time"); 
    dispatch_group_notify(myDispatchGroup, dispatch_get_main_queue(), ^{ 
      dispatch_release(myDispatchGroup); 
      [self parsingCompleteWithActivity:activity]; 
    }); 
} 

幸運を祈る!

関連する問題