参考博客:https://www.cnblogs.com/zhou--fei/p/6747938.html
一、dispatch_group_t相关属性介绍
1.dispatch_group_async(group, queue, block);将block任务添加到queue队列,并被group组管理
2.dispatch_group_enter(group);
声明dispatch_group_enter(group)下面的任务由group组管理,group组的任务数+1
3.dispatch_group_leave(group);
相应的任务执行完成,group组的任务数-1
4.dispatch_group_create();
创建一个group组
5.dispatch_group_wait(group1,DISPATCH_TIME_FOREVER);
当前线程暂停,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的
任务执行完成后,线程才继续执行。
6.dispatch_group_notify(group1,queue1,block);
监听group组中任务的完成状态,当所有的任务都执行完成后,触发block块,执行总结性处
理。
二、常见用法的区别
1、dispatch_group_async(group, queue, block)和dispatch_group_notify(group1,
queue1,block)组合
这种组合下在执行同步任务时正常,但是不能保证queue中人物的执行顺序
在执行异步任务时不正常,会出现先执行dispatch_group_notify的情况
同步任务:
dispatch_queue_t queue1 =
dispatch_queue_create("dispatchGroupMethod1.queue1",
DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group1 =dispatch_group_create();
dispatch_group_async(group1, queue1, ^{
dispatch_sync(queue1, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);
}
});
});
dispatch_group_async(group1, queue1, ^{
dispatch_sync(queue1, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);
}
});
});
//等待上面的任务全部完成后,会收到通知执行block中的代码(不会阻塞线程)
dispatch_group_notify(group1, queue1,^{
NSLog(@"Method1-全部任务执行完成");
});
2、dispatch_group_enter(group)和dispatch_group_leave(group)和
dispatch_group_notify(group1, queue1,block)组合
该组合下执行同步任务正常,可以使得queue中的任务block按照添加顺序依次执行
执行异步任务正常,但是不能保证queue中人物的执行顺序
同步任务代码
dispatch_queue_t queue2 =
dispatch_queue_create("dispatchGroupMethod2.queue2",
DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group2 = dispatch_group_create();
dispatch_group_enter(group2);
dispatch_sync(queue2, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);
}
dispatch_group_leave(group2);
});
dispatch_group_enter(group2);
dispatch_sync(queue2, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);
}
dispatch_group_leave(group2);
});
//等待上面的任务全部完成后,会收到通知执行block中的代码(不会阻塞线程)
dispatch_group_notify(group2, queue2, ^{
NSLog(@"Method2-全部任务执行完成");
});