特点: 调度组中的所有异步任务执行结束后, 会得到统一的通知
使用场景: 监听一组异步任务是否执行结束, 如果执行结束就能得到统一的通知
常规用法:
<span style="font-size:14px;">- (void)gcdDemo1
{// 调度组dispatch_group_t group = dispatch_group_create();// 队列dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_CONCURRENT);// 将任务添加到队列和调度组dispatch_group_async(group, queue, ^{NSLog(@"下载 A %@",[NSThread currentThread]);});dispatch_group_async(group, queue, ^{NSLog(@"下载 B %@",[NSThread currentThread]);});dispatch_group_async(group, queue, ^{NSLog(@"下载 C %@",[NSThread currentThread]);});// 异步 : 调度组中的所有异步任务执行结束之后,在这里得到统一的通知dispatch_group_notify(group, queue, ^{NSLog(@"下载完成 %@",[NSThread currentThread]);});// 同步 : 一直等到调度组中所有的任务都执行结束以后才执行后面的代码
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// 验证调度组是否是异步NSLog(@"end");
}
</span>
注: dispatch_group_notify 这个函数是异步的, 如果换成同步用 dispatch_group_wait(group, DISPATCH_TIME_FOREVER), 用了同步的代码, 一直等调度组中的所有任务执行结束后才执行后面的代码
enter 和 leavel
dispatch_group_enter(group)函数内部实现原理
终端输入:man dispatch_group_enter
连续两个空格
The dispatch_group_async() convenience function behaves like so:void
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{dispatch_retain(group);dispatch_group_enter(group);dispatch_async(queue, ^{block();dispatch_group_leave(group);dispatch_release(group);});
}
dispatch_group_leave(group)函数, 必须和dispatch_group_enter(group)成对出现, 必须在block的最后一句
用法:- (void)gcdDemo2
{// 调度组dispatch_group_t group = dispatch_group_create();// 队列dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_CONCURRENT);// dispatch_group_enter 和 dispatch_group_leave 必须成对出现dispatch_group_enter(group);dispatch_group_async(group, queue, ^{NSLog(@"下载 A %@",[NSThread currentThread]);// dispatch_group_leave 必须是 block 的最后一句dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_group_async(group, queue, ^{NSLog(@"下载 B %@",[NSThread currentThread]);dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_group_async(group, queue, ^{NSLog(@"下载 C %@",[NSThread currentThread]);dispatch_group_leave(group);});// 异步 : 调度组中的所有异步任务执行结束之后,在这里得到统一的通知dispatch_group_notify(group, queue, ^{NSLog(@"下载完成 %@",[NSThread currentThread]);});// 同步 : 一直等到调度组中所有的任务都执行结束以后才执行后面的代码
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// 验证调度组是否是异步NSLog(@"end");
}
使用场景: SDWebImage下载图片, 所有下载图片任务下载完成之后进行回调
注: 同样
一直等调度组中的所有任务执行结束后才执行后面的代码, 也可以换成同步, 请参考常规用法