特点: 调度组中的所有异步任务执行结束后, 会得到统一的通知
使用场景: 监听一组异步任务是否执行结束, 如果执行结束就能得到统一的通知
常规用法:
<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, dispat
ch_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下载图片, 所有下载图片任务下载完成之后进行回调
注: 同样
一直等调度组中的所有任务执行结束后才执行后面的代码, 也可以换成同步, 请参考常规用法