如果当前队列组内有未执行完成的任务,那么他就会一直阻塞着其对应的队列。
只有未执行完成的任务数变为0时,才会解除阻塞,并执行后面追加到该队列组的其他任务。
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_enter(group);//任务数 +1
dispatch_async(queue, ^{
NSLog(@"任务1");
dispatch_group_leave(group);//任务数 -1
});
dispatch_group_enter(group);//任务数 +1
dispatch_async(queue, ^{
NSLog(@"任务2");
dispatch_group_leave(group);//任务数 -1
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"所有请求执行完毕,刷新UI");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//等待上面任务全部完成后,往下继续执行(阻塞当前线程)
dispatch_group_async(group, queue, ^{
NSLog(@"任务3");
});
任务1 和任务2 异步并行执行,且在他们执行完前阻塞当前queue队列。
任务1 和任务2 全部执行完毕后,dispatch_group_wait解除阻塞,开始执行任务3。
所有任务都执行完成后,dispatch_group_notify回调。
从此也可以看出:这里的dispatch_group_enter、dispatch_group_leave 是组合使用的,其作用同于dispatch_group_async。
网友评论