GCD使用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(, );
dispatch_group_enter(group);
//模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep();
NSLog(@"%@---block1结束。。。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---1结束。。。",[NSThread currentThread]);
dispatch_group_enter(group);
//模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep();
NSLog(@"%@---block2结束。。。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---2结束。。。",[NSThread currentThread]);
dispatch_group_notify(group, dispatch_get_global_queue(, ), ^{
NSLog(@"%@---全部结束。。。",[NSThread currentThread]);
});
}
运行app,点击页面打印的结果如下:
-- ::27.853 CPMNetworking[:] <NSThread: 0x600000068600>{number = , name = main}---1结束。。。
-- ::27.856 CPMNetworking[:] <NSThread: 0x600000068600>{number = , name = main}---2结束。。。
-- ::30.923 CPMNetworking[:] <NSThread: 0x608000263f00>{number = , name = (null)}---block1结束。。。
-- ::30.930 CPMNetworking[:] <NSThread: 0x6000002647c0>{number = , name = (null)}---block2结束。。。
-- ::30.930 CPMNetworking[:] <NSThread: 0x6000002647c0>{number = , name = (null)}---全部结束。。。
结论:
在开启了多线程执行任务时,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。
GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作的更多相关文章
- NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程
单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一. 进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...
- 20 (OC)* GCD、NSOperation、NSThread。多线程
多线程编程技术的优缺点比较 NSThread (抽象层次:低) 优点:轻量级,简单易用,可以直接操作线程对象 缺点: 需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销. C ...
- iOS 多线程 GCD part3:API
https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...
- iOS开发之多线程(NSThread、NSOperation、GCD)
整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...
- ios开发多线程--GCD
引言 虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能.当然,使用GCD完成一些简单的 ...
- iOS开发——GCD多线程详解
GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...
- UI:多线程 、用GCD创建线程
什么是应用(程序):就是我们编写的代码编译后生成的app文件 进程:凡是一个运行的程序都可以看作为一个进程,如打开的多个 word,就可以认为是一个进程的多个线程. 线程:至少有一个线程就是主线程,网 ...
- iOS 多线程 浅述
什么是进程? 进程是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 什么是线程? 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程 ...
- iOS - Threads 多线程
1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程. ...
随机推荐
- 判断Ie浏览器
ie8以下 if(!+[1,]) if(window.attachEvent){ alert("ie")}else if(window.addEventListener){aler ...
- Origin9.1如何使用原始数据(Raw Data)绘制风向玫瑰图
核心提示:今天为大家简单介绍下如何使用原始数据绘制风向玫瑰图.本例以Origin 9.1进行演示.1.本例所用数据截图如下,列A为风向,列B为风速.2.选中两列数据,进入Plot下的Specializ ...
- Linux系统编程-防止僵尸进程产生的常用方法
1.父进程调用wait函数或waitpid函数回收子进程. 2.让init进程去处理子进程回收工作,代码中加上"signal(SIGCHLD, SIG_IGN)"这句话.
- PHP的OB缓存(输出缓存)
使用PHP自带的缓存机制 原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器. ...
- 如何通过maven ,将本地jar 安装到仓库中去。
场景: 现在很多公司,都有 maven 的私服 ,在maven项目中,基本上有两个仓库 ,一个是maven的公共仓库,一个是私服仓库: 有的时候,我们download 别人的代码的时候,pom文件中报 ...
- 用过的一个jquery插件实现转盘效果还不错手机兼容
(function($) {var supportedCSS,styles=document.getElementsByTagName("head")[0].style,toChe ...
- java string类型的初始化
以下基本上是java string类型最常用的三种方法 new string()就不介绍了 基本等同于第三种 String a; 申明一个string类型的 a,即没有在申请内存地址,更没有在内存 ...
- 反射中通过class标记来获取字段及方法
//这是通过class标记获取字段的代码 Field[] fields= classzz.getDeclaredFields(); //获取该class标记的表名代码,必须为,getSimpleNam ...
- Java script基础 回顾
一.语法 代码与C#相似,变量使用的是var引用出来,包含所有类型:可以直接使用,不用定义. 也是有内置分类的.例如:var b="10" var c=10;一个是字符串一个是整 ...
- CCF 201612-1 最大波动 (水题)
问题描述 小明正在利用股票的波动程度来研究股票.小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少. 输入 ...