GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作
2016-12-23 10:06
211 查看
一、简介
dispatch_group_enter:通知group,下面的任务马上要放到group中执行了。
dispatch_group_leave:通知group,任务完成了,该任务要从group中移除了。
这两种通知可以在多线程间自由穿梭的。
二、验证
下面用代码验证下它们的作用。
运行app,点击页面打印的结果如下:
结论:
在开启了多线程执行任务时,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。
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,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。
相关文章推荐
- CD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作
- 记录dispatch_group_enter()和dispatch_group_leave()的使用
- dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步
- iOS多线程GCD深入之Dispatch Group使用
- iOS - dispatch group用法(dispatch_group_leave、dispatch_group_enter)
- GCD中使用dispatch_after函数延迟处理任务
- iOS GCD之dispatch_group的使用(多个文件并发上传)
- ios使用dispatch_group_async和dispatch_group_notify异步转同步
- iOS GCD中级篇 - dispatch_group的理解及使用
- iOS dispatch group dispatch_group_notify 多线程等待 多个数据请求处理 异步请求
- iOS--GCD(使用dispatch_group来进行线程同步)
- iOS dispatch_group_enter的使用
- dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步
- iOS系统GCD学习(3):dispatch_group
- GCD 学习(四) dispatch_group
- GCD(Grand Central Dispatch)和Block 使用-浅析
- iOS系统GCD学习(4):dispatch_group2
- iOS系统GCD学习(3):dispatch_group
- iOS系统GCD学习(4):dispatch_group2
- iOS GCD集汇(一)GCD(Grand Central Dispatch)和Block 使用-浅析