問題
如何用GCD實現圖中要求:任務1、2、3并行;任務0等1、2、3都結束后執(zhí)行;任務4、5、6并行并且等任務0結束后才執(zhí)行 ?
方法一: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,計數減為零則觸發(fā)Notifiy;否則依賴該Group的block會直接執(zhí)行
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常配合并行隊列,但只是對自己創(chuàng)建的并行隊列有效,對于系統(tǒng)提供的全局并行隊列無效,可能蘋果是出于安全考慮而做了特殊處理