概览
定义在group.h中,api较少,只有创建、提交、阻塞、通知组
- 创建组
dispatch_group_t
dispatch_group_create(void);
- 在组中异步提交block到队列
void
dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
- 在组中异步提交c函数指针到队列
void
dispatch_group_async_f(dispatch_group_t group,
dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
- 阻塞当前线程直到一组任务执行完毕或者超时
intptr_t
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
- 一组任务执行完毕通知回到block
void
dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
- 一组任务执行完毕通知回到c函数指针
void
dispatch_group_notify_f(dispatch_group_t group,
dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
- 进入组相当于dispatch_group_async,信号量+1
void
dispatch_group_enter(dispatch_group_t group);
离开组相当于group中的一个任务执行完毕,信号量-1
void
dispatch_group_leave(dispatch_group_t group);
注意:
group是基于信号量实现的,所以一组任务在任意队列执行,结果都是一样的
使用
NSLog(@"begin:%@",[NSThread currentThread]);
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"1:%@",[NSThread currentThread]);
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"2:%@",[NSThread currentThread]);
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"end:%@",[NSThread currentThread]);
});
NSLog(@"任务提交完毕");
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"等待任务全部完成后再往下执行");
NSLog(@"begin:%@",[NSThread currentThread]);
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{
NSLog(@"1:%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"2:%@",[NSThread currentThread]);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"end:%@",[NSThread currentThread]);
});
NSLog(@"任务提交完毕");
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"等待任务全部完成后再往下执行");
上面这两种写法等效,输出结果如下:
2021-08-23 10:46:43.862446+0800 GCDDemo[4404:2489050] begin:<NSThread: 0x2838a08c0>{number = 1, name = main}
2021-08-23 10:46:43.862566+0800 GCDDemo[4404:2489050] 任务提交完毕
2021-08-23 10:46:43.862663+0800 GCDDemo[4404:2489062] 1:<NSThread: 0x2838e4ac0>{number = 6, name = (null)}
2021-08-23 10:46:43.862694+0800 GCDDemo[4404:2489064] 2:<NSThread: 0x2838e1100>{number = 7, name = (null)}
2021-08-23 10:46:43.862760+0800 GCDDemo[4404:2489050] 等待任务全部完成后再往下执行
2021-08-23 10:46:43.872680+0800 GCDDemo[4404:2489050] end:<NSThread: 0x2838a08c0>{number = 1, name = main}
总结
底层基于信号量实现,用于实现有依赖关系的并发操作
dispatch_group是一个初始值为LONG_MAX的信号量,根据信号量值是否恢复成初始值判断执行dispatch_group_notify,dispatch_group_enter执行信号量-1,dispatch_group_leave执行信号量+1, dispatch_group_wait会阻塞当前线程直到一组任务执行完毕或者超时






网友评论