一、簡介
dispatch_group_enter:通知group,下面的任務馬上要放到group中執行了。
dispatch_group_leave:通知group,任務完成了,該任務要從group中移除了。
這兩種通知可以在多執行緒間自由穿梭的。
二、驗證
下面用程式碼驗證下它們的作用。
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ [self syncAction]; } - (void)syncAction{ dispatch_group_t group =dispatch_group_create(); dispatch_queue_t globalQueue=dispatch_get_global_queue(0, 0); dispatch_group_enter(group); //模擬多執行緒耗時操作 dispatch_group_async(group, globalQueue, ^{ sleep(3); NSLog(@"%@---block1結束。。。",[NSThread currentThread]); dispatch_group_leave(group); }); NSLog(@"%@---1結束。。。",[NSThread currentThread]); dispatch_group_enter(group); //模擬多執行緒耗時操作 dispatch_group_async(group, globalQueue, ^{ sleep(3); NSLog(@"%@---block2結束。。。",[NSThread currentThread]); dispatch_group_leave(group); }); NSLog(@"%@---2結束。。。",[NSThread currentThread]); dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"%@---全部結束。。。",[NSThread currentThread]); }); }
執行app,點選頁面列印的結果如下:
2016-12-23 09:46:27.853 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---1結束。。。 2016-12-23 09:46:27.856 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---2結束。。。 2016-12-23 09:46:30.923 CPMNetworking[1341:36550] <NSThread: 0x608000263f00>{number = 4, name = (null)}---block1結束。。。 2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---block2結束。。。 2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---全部結束。。。
結論:
在開啟了多執行緒執行任務時,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保證了等所有的子執行緒任務處理完後,有一個處理最後結果的地方。