iOS 底层 多线程 队列组应用 - AlvinSunny/OC-TheUnderlying GitHub Wiki
写在前面,队列可分为:串行队列和并发队列
队列组是什么 ?
队列组就是把多个队列组合起来使用。
用队列组来解决一下问题
如何用GCD实现以下功能:
- 异步并发执行任务1、任务2
- 等任务1、任务2都执行完毕后,在回到主线程执行任务3
利用组队列
- (void)test
{
//1. 创建队列组
dispatch_group_t group = dispatch_group_create();
//2. 两种创建方式
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
// dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//3. 异步并发执行任务1、任务2
dispatch_group_async(group, queue, ^{
NSLog(@"任务1 - %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"任务2 - %@",[NSThread currentThread]);
});
//4. 等任务1、任务2都执行完毕后,在回到主线程执行任务3
dispatch_group_notify(group, queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"任务3 - %@",[NSThread currentThread]);
});
});
}

ABC执行完后 D依赖AB E依赖BC F依赖DE
dispatch_group_enter/dispatch_group_leave的真正用法 设置GCD依赖
- 先用dispatch_group_create 函数获取3个group
- 并行的任务放到一个组, AB加入g1 BC加入g2 DE加入g3
- 依赖项D利用函数dispatch_group_notify函数等待被依赖AB所在的group执行完毕
+ (void)test2 {
dispatch_group_t g1 = dispatch_group_create();
dispatch_group_t g2 = dispatch_group_create();
dispatch_group_t g3 = dispatch_group_create();
dispatch_group_enter(g1);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for(int i = 0; i < 3; i++){
NSLog(@"----A----");
}
dispatch_group_leave(g1);
});
dispatch_group_enter(g1);
dispatch_group_enter(g2);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for(int i = 0; i < 3; i++){
NSLog(@"----B----");
}
dispatch_group_leave(g1);
dispatch_group_leave(g2);
});
dispatch_group_enter(g2);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for(int i = 0; i < 3; i++){
NSLog(@"----C----");
}
dispatch_group_leave(g2);
});
dispatch_group_enter(g3);
dispatch_group_notify(g1, dispatch_get_global_queue(0, 0), ^{
for(int i = 0; i < 3; i++){
NSLog(@"----D----");
}
dispatch_group_leave(g3);
});;
dispatch_group_enter(g3);
dispatch_group_notify(g2, dispatch_get_global_queue(0, 0), ^{
for(int i = 0; i < 3; i++){
NSLog(@"----E----");
}
dispatch_group_leave(g3);
});
dispatch_group_notify(g3, dispatch_get_global_queue(0, 0), ^{
for(int i = 0; i < 3; i++){
NSLog(@"----F----");
}
});
}
打印结果:
----A----
----B----
----C----
----A----
----B----
----C----
----A----
----C----
----B----
----D----
----E----
----D----
----E----
----D----
----E----
----F----
----F----
----F----