Grand Central Dispatch。如何运行一个异步组,等待,然后运行另一个,再次等待,然后完成?

时间:2011-12-08 16:28:02

标签: objective-c ios grand-central-dispatch

下面是一个示例函数,我尝试运行一个主要组,等待,然后在不同的线程上运行另外两个后台任务,等待,然后返回在下面显示的常规块中更改的值。下面显示的是我对如何做到这一点的猜测。如果我在一个块中运行这些块,它就可以工作。当我分开块时,它会失败。有没有人有他们如何完成类似的事情的例子?在此先感谢您的帮助。

-(NSString *)sampleFunction:(NSString*)inputString
{
 __block NSString *returnString;

 dispatch_group_t mainGroup = dispatch_group_create();
 dispatch_group_t otherGroup = dispatch_group_create();

 void (^firstBlock)(void) = ^(void)
 {
  ...
 };

 void (^secondBlock)(void) = ^(void)
 {
  ...
 };


 void (^thirdBlock)(void) = ^(void)
 {
  ...
 };

 dispatch_group_async(oneGroup, dispatch_get_global_queue(0, 0), firstBlock);

 dispatch_group_wait(oneGroup, sizeof(int));

 dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), secondBlock);
 dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), thirdBlock);

 dispatch_group_wait(otherGroup, sizeof(int));

 dispatch_release(userGroup); 
 dispatch_release(otherGroup);

 return returnString;
}

2 个答案:

答案 0 :(得分:7)

dispatch_semaphore是你的朋友。 : - )

/* Create your semaphore with 0 */
dispatch_semaphore_t sema = dispatch_semaphore_create(0);

/* wait on the semaphore, causes your second & third queue to wait */
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

/* At the end of your first queue finishing, signal the semaphore waiting in 
   the 2nd queue to take over */
dispatch_semaphore_signal(sema);

如果你想要一个更简单的解决方案,只需使用dispatch_apply(它使信号量为你工作)而不是这些组,但不能完全确定你使用你的组。

答案 1 :(得分:4)

有很多不同的方法可以做到这一点,但最概念上简单(或至少是显而易见的)方法是为“管道”的每个阶段创建一个组,然后为A组安排完成回调计划在B组工作,它也有一个完成回调,用于安排C组的工作。

这里的关键不是实际上“等待”一个小组完成 - 这是不必要的。组可以有完成块,当该组中的最后一个块完成时,它将自动运行(请参阅dispatch_group_notify()),这是创建“扇入”点的好方法,在这些点中你已经分散了一大堆工作基。