dispatch_group的使用:把一组任务提交到队列中,这些队列可以不相关,然后实现这组任务的事件。
dispatch_group_create() 创建group;
dispatch_group_async 把一个任务异步添加到group中;
dispatch_group_wait 等待group执行的时间;
dispatch_group_notify 监听group事件的执行完毕;
dispatch_group_enter()指明一个任务执行块进入了一个group;
dispatch_group_leave()表明执行块执行完毕,移除出group;
dispatch_group_enter && dispatch_group_leave必须成对出现;
//获得全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建group
dispatch_group_t group = dispatch_group_create();
//异步添加任务A
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"AAAA------%d",i);
}
});
//异步添加任务B
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"BBBB------%d",i);
}
});
//异步添加任务C
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"CCCC------%d",i);
}
});
//监听group事件的执行完毕
dispatch_group_notify(group, queue, ^{
NSLog(@"Group 执行完成");
});
dispatch_async(queue, ^{
NSLog(@"----Test");
//执行group的时间超过10s后,便执行下方代码,若提前完成,则直接执行
//dispatch_group_wait是同步的,不能放在主线程
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC));
NSLog(@"-----End");
});
打印结果:
对于同步任务,dispatch_group_enter && dispatch_group_leave组合起来相当于dispacth_group_async(),对于异步任务用dispacth_group_async()会出现问题,例如:
dispatch_group_async(group, queue, ^{
self.testDo.doSomething = ^(){
//do something
};
});