问题
如何用GCD实现图中要求:任务1、2、3并行;任务0等1、2、3都结束后执行;任务4、5、6并行并且等任务0结束后才执行 ?
方法一:group
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globalQueue, ^{
NSLog(@"任务 1");
});
dispatch_group_async(group, globalQueue, ^{
NSLog(@"任务 2");
});
dispatch_group_async(group, globalQueue, ^{
NSLog(@"任务 3");
});
dispatch_group_t group2 = dispatch_group_create();
//手动管理Group计数,必须配套dispatch_group_leave,计数减为零则触发Notifiy;否则依赖该Group的block会直接执行
dispatch_group_enter(group2);
dispatch_group_notify(group, globalQueue, ^{
dispatch_async(globalQueue, ^{
NSLog(@"任务 0");
dispatch_group_leave(group2);
});
});
dispatch_group_notify(group2, globalQueue, ^{
dispatch_async(globalQueue, ^{
NSLog(@"任务 4");
});
dispatch_async(globalQueue, ^{
NSLog(@"任务 5");
});
dispatch_async(globalQueue, ^{
NSLog(@"任务 6");
});
});
方法二:barrier
dispatch_queue_t cocurrentQueue = dispatch_queue_create("concurrent queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(cocurrentQueue, ^{
NSLog(@"任务 1");
});
dispatch_async(cocurrentQueue, ^{
NSLog(@"任务 2");
});
dispatch_async(cocurrentQueue, ^{
NSLog(@"任务 3");
});
dispatch_barrier_async(cocurrentQueue, ^{
NSLog(@"任务 0");
});
dispatch_async(cocurrentQueue, ^{
NSLog(@"任务 4");
});
dispatch_async(cocurrentQueue, ^{
NSLog(@"任务 5");
});
dispatch_async(cocurrentQueue, ^{
NSLog(@"任务 6");
});
注意:barrier常配合并行队列,但只是对自己创建的并行队列有效,对于系统提供的全局并行队列无效,可能苹果是出于安全考虑而做了特殊处理