第47月第17天 dispatch_group_wait dispatch_group_notify
1.
- dispatch_group_enter标志着一个任务追加到 group,执行一次,相当于 group 中未执行完毕任务数+1
- dispatch_group_leave标志着一个任务离开了 group,执行一次,相当于 group 中未执行完毕任务数-1。
- 当 group 中未执行完毕任务数为0的时候,才会使dispatch_group_wait解除阻塞,以及执行追加到dispatch_group_notify中的任务。
#pragma mark dispatch_group_enter、dispatch_group_leave - (void)gcd_dispatch_group_enter_leave { //打印当前线程 NSLog(@"currentThread---%@",[NSThread currentThread]); NSLog(@"group---begin"); dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_enter(group); dispatch_async(queue, ^{ // 追加任务1 for (int i = 0; i < 2; ++i) { //模拟耗时操作 [NSThread sleepForTimeInterval:2]; //打印当前线程 NSLog(@"1---%@",[NSThread currentThread]); } dispatch_group_leave(group); }); dispatch_group_enter(group); dispatch_async(queue, ^{ // 追加任务2 for (int i = 0; i < 2; ++i) { //模拟耗时操作 [NSThread sleepForTimeInterval:2]; //打印当前线程 NSLog(@"2---%@",[NSThread currentThread]); } dispatch_group_leave(group); }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ //等前面的异步操作都执行完毕后,回到主线程. for (int i = 0; i < 2; ++i) { //模拟耗时操作 [NSThread sleepForTimeInterval:2]; //打印当前线程 NSLog(@"3---%@",[NSThread currentThread]); } NSLog(@"group---end"); }); NSLog(@"code end"); //等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程) dispatch_group_wait(group, DISPATCH_TIME_FOREVER); NSLog(@"等待上面的1,2任务全部完成后,会继续往下执行,阻塞当前线程"); }