有這么一個需要,分別執(zhí)行2個耗時的異步操作,等2個異步操作都執(zhí)行完畢后在回到主線程執(zhí)行操作。如果想要快速高效地實現(xiàn)這個需求浸间,可以考慮使用調度組。
調度組的創(chuàng)建代碼如下:
dispatch_group_t group = dispatch_group_create();
往調度組里面添加任務的函數(shù)如下:
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block)
第一個參數(shù)group是一個調度組吟榴,queue是一個異步隊列魁蒜,這里如果使用同步隊列意義就不大了,不過還是能達到效果吩翻,第三個參數(shù)是一個執(zhí)行代碼塊兜看,任務都添加到該代碼塊里面。
往調度組里面添加任務并獲得通知的代碼如下:
//? 群組-統(tǒng)一監(jiān)控一組任務
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 添加任務
// group 負責監(jiān)控任務狭瞎,queue 負責調度任務
dispatch_group_async(group, q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"任務1 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"任務2 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"任務3 %@", [NSThread currentThread]);
});
// 監(jiān)聽所有任務完成 - 等到 group 中的所有任務執(zhí)行完畢后铣减,"由隊列調度 block 中的任務異步執(zhí)行"
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 修改為主隊列,后臺批量下載脚作,結束后葫哗,主線程統(tǒng)一更新UI
NSLog(@"OK %@", [NSThread currentThread]);
});
NSLog(@"come here");
代碼的執(zhí)行結果如下:
其中任務的下載順序以及"come here”出現(xiàn)的地方不確定,但主線程的更新操作總會在最后才執(zhí)行球涛!
GCD調度組中還有一個添加任務的函數(shù):
dispatch_group_enter(dispatch_group_t group)
dispatch_group_leave(dispatch_group_t group)
這兩個函數(shù)要配對出現(xiàn)
例如:
// 群組-統(tǒng)一監(jiān)控一組任務
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 1> 入組 -> 之后的 block 會被 group 監(jiān)聽
// dispatch_group_enter 一定和 dispatch_group_leave 要配對出現(xiàn)
dispatch_group_enter(group);
dispatch_async(q, ^{
NSLog(@"task1 %@", [NSThread currentThread]);
// block 的末尾劣针,所有任務執(zhí)行完畢后,添加一個出組
dispatch_group_leave(group);
});
//? 再次入組
dispatch_group_enter(group);
dispatch_async(q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"task2 %@", [NSThread currentThread]);
// block 的末尾亿扁,所有任務執(zhí)行完畢后捺典,添加一個出組
dispatch_group_leave(group);
});
// 群組結束
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"OVER");
});
NSLog(@"come here");
代碼執(zhí)行的效果與剛才那種方式相同!
GCD中還有一個函數(shù)
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)
該函數(shù)是個阻塞式的等待从祝,當我們將第二個參數(shù)設置為DISPATCH_TIME_FOREVER時襟己,群組任務不執(zhí)行完,后續(xù)代碼就會無法執(zhí)行牍陌,也就是說只要任務不執(zhí)行完come here就不會打印擎浴。