一、簡介
dispatch_group_enter:通知group罪治,下面的任務(wù)馬上要放到group中執(zhí)行了丽声。
dispatch_group_leave:通知group,任務(wù)完成了觉义,該任務(wù)要從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結(jié)束。洪囤。徒坡。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---1結(jié)束。瘤缩。喇完。",[NSThread currentThread]);
dispatch_group_enter(group);
//模擬多線程耗時操作
dispatch_group_async(group, globalQueue, ^{
sleep(3);
NSLog(@"%@---block2結(jié)束。剥啤。锦溪。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---2結(jié)束。府怯。刻诊。",[NSThread currentThread]);
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"%@---全部結(jié)束。富腊。坏逢。",[NSThread currentThread]);
});
}
運行app,點擊頁面打印的結(jié)果如下:
2016-12-23 09:46:27.853 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---1結(jié)束赘被。是整。。
2016-12-23 09:46:27.856 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---2結(jié)束民假。浮入。。
2016-12-23 09:46:30.923 CPMNetworking[1341:36550] <NSThread: 0x608000263f00>{number = 4, name = (null)}---block1結(jié)束羊异。事秀。彤断。
2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---block2結(jié)束。易迹。宰衙。
2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---全部結(jié)束。睹欲。供炼。
結(jié)論:
在開啟了多線程執(zhí)行任務(wù)時,若使用了dispatch_group_notify窘疮、dispatch_group_enter袋哼、dispatch_group_leave,也能有效的保證了等所有的子線程任務(wù)處理完后闸衫,有一個處理最后結(jié)果的地方涛贯。