GCD group中有比较多的方法和注意事项,所以值得单独写一篇文章总结。
1. Group主要方法
dispatch_group_create() //创建组
dispatch_group_enter(group); //进入组(group为传入参数)
dispatch_group_leave(group); //离开组(group为传入参数)
dispatch_group_async(group, queue, ^{
});
//组通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
});
//参数1:组 参数2:超时时间(除了传入具体时间还可以使用DISPATCH_TIME_NOW、DISPATCH_TIME_FOREVER)
dispatch_group_wait(group, 5);
//其他已_f结尾的方法
dispatch_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work)
//除了传入队列外,包含一个参数指针和c函数。一般不会用这种方式所以不做探讨。
2. 添加任务到组,有两种方式。
方式1:
//创建组
dispatch_group_t group = dispatch_group_create();
//加入组
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务1");
//任务完成后通知组:任务离开
dispatch_group_leave(group);
});
其中dispatch_group_enter(group),dispatch_group_leave(group)成对使用。dispatch_group_leave(group)通常在任务结束后调用,使用灵活。
方式2:
//创建组
dispatch_group_t group = dispatch_group_create();
//添加任务到组
dispatch_group_async(group, queue, ^{
NSLog(@"任务2");
});
此种方式可直接把任务加入到组,不需要写dispatch_group_enter(group),dispatch_group_leave(group)方法。
需要注意:这种方式认为任务代码执行完即为结束,所以block中的任务不能是异步任务。比如
dispatch_group_async(group, queue, ^{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(1);
NSLog(@"异步任务");
});
NSLog(@"完");
});
上述代码打印完“完”,就认为任务结束,并不会等待打印“异步任务”。所以上述情况还是要使用方式1。
3. 通过dispatch_group_notify监听所有任务已完成(或已离开)
dispatch_group_notify(group, queue, ^{
});
此方法会在组内所有任务完成或离开后执行,对队列无要求,同时适用于上述任务加入组的两种方式。
4. dispatch_group_wait方法
dispatch_group_wait(group, 5);
因为平时没有用过,特意查了查。苹果的文档只介绍了功能和相关参数等,说是同步等待组任务执行完成或超时,但是我用各种方式都没能实现阻塞线程等待的功能。查阅其他博客有说不能在主线程调用,会阻塞主线程,但是我试了试依然不会阻塞。这个以后找到使用方式再详谈。