2012-02-23 30 views
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

如果我使用信号灯,然后在每次呼叫后发信号等待。 也适用于我调用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]; 
    }); 
} 

祝你好运!