GCD(Dispatch Group)

       Dispatch Group允许聚合同步。您的应用程序可以提交多个Block和跟踪,当他们全部完成时,即使他们可能会在不同的Dispatch Queue上运行。当所有指定的任务完成时,这种行为可能会有所帮助,直到完成所有的任务为止。

例:

dispatch_queue_t queue =

    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{NSLog(@"blk0");});

dispatch_group_async(group,queue,^{NSLog(@"blk1");});

dispatch_group_async(group,queue,^{NSLog(@"blk2");});

dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"done");});

dispatch_release(group);

      无论向什么样的 Dispatch Queue 中追加处理,使用 Dispatch Group 都可监视这些处理执行的结束。一旦检测到所有处理执行结束,就可将结束的处理追加到 Dispatch Queue 中。

1.向调度队列提交一个Block,并将该块与指定的Dispatch Group关联。

void dispatch_group_async( dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);

2.创建一个新的Dispatch Group,该组Block可以关联。

dispatch_group_t dispatch_group_create( void);

      Dispatch Group 和 Dispatch Queue 相同,在使用结束后需要通过 dispatch_release 函数释放。

3.当Dispatch Group 中的块对象已完成时,追加给一个 Dispatch Queue将执行的 Block。

void dispatch_group_notify( dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);

       在dispatch_group_notify 函数中无论指定什么样的 Dispatch Queue,属于 Dispatch Group 的全部处理在追加指定的 Block 时都已执行结束。


       另外,在 dispatch Group 中也可以使用 dispatch_group_wait 函数仅等待全部处理执行结束。

dispatch_queue_t =          

      dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{NSLog(@"blk0");});

dispatch_group_async(group,queue,^{NSLog(@"blk1");});

dispatch_group_async(group,queue,^{NSLog(@"blk2");});

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);

dispatch_release(group);

4.为先前提交的Block同步等待完成;如果在指定的超时周期结束之前,Block不完成,则返回。

long dispatch_group_wait( dispatch_group_t group, dispatch_time_t timeout);

       函数的第二个参数指定为等待的时间(超时),它属于 dispatch_time_t 类型的值。   

       DISPATCH_TIME_FOREVER,意味着永久等待。只要属于 Dispatch Group 的处理尚未执行结束,就会一直等待,中途不能取消,函数返回值恒为0。

       如同 dispatch_after 函数说明中出现的那样,指定等待间隔为1s 时应做如下处理。

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,1ull * NSEC_PER_SEC);

long result = dispatch_group_wait(group,time);

if(result == 0){

/**属于 Dispatch Group 的全部处理执行结束 */

}

else{

/** 属于 Dispatch Group 的某一个处理还在执行中 */

}

      若指定 DISPATCH_TIME_NOW,则不用任何等待就可判断属性 Dispatch Group 的处理是否执行结束。虽然这样也可以,但一般在这种情形下,推荐使用 dispatch_group_notify 函数。

你可能感兴趣的:(GCD(Dispatch Group))