iOS dispatch_semaphore_t(信号量)和 2.dispatch_group_t (组)
2017年,回望过去,前半年还致力于iOS开发,后半年就开始了python的漫漫之路,一路上走走停停,不过还好,总的来说,2017是收获的一年,也是付出的一年。2018加油!
话题转回来,关于线程执行的时候,大家可能会遇到一个问题,一个请求需要上一个请求的返回的数据作为参数,可是呢,你又想走异步操作,这时候问题就来了,还没有拿到上一个请求返回的参数,下一个请求已经开始操作了,就我而言的话,我会用三种方式进行:1.block回调,block的话直接block作为参数也可以实现 2. dispatch_semaphore_t(信号量) 3.dispatch_group_t (组) 。关于Block的问题就不细说了,这里只说后两种
1.dispatch_semaphore_t(信号量)
这是需要用到的参数
/**
关于异步操作按照信号量的顺序进行一步步返回
* dispatch_semaphore_t 创建信号量,如果value小0 的话,这个信号量为空,
* dispatch_semaphore_wait 可以让信号量减1,如果信号量是0,会等到信号量为非0再次进行下一步操作
* dispatch_semaphore_signal 可以让信号量加1
* 可以使用sleep进行区分执行顺序
*/
这是基本使用,任务操作会按照你自己设定的顺序进行操作,sleep()只是为了区分
- (void)testDispatch_sempaphore { dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
//进行异步操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"异步操作1:%@", [NSThread currentThread]);
dispatch_semaphore_signal(semaphore);
}); //异步操作2
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
NSLog(@"异步操作2:%@", [NSThread currentThread]);
dispatch_semaphore_signal(semaphore);
});
//异步操作3
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"异步操作3:%@", [NSThread currentThread]);
dispatch_semaphore_signal(semaphore);
}); }
2.dispatch_group_t (组)
对于dispatch_group 大家都有了解,需要记得出入规则即可:先进先出
/**
* dispatch_queue_t 操作
* dispatch_group_t 任务组(进出规则:先进先出)
* dispatch_group_enter 添加任务
* dispatch_group_leave 任务完成
* dispatch_group_wait 对子线程阻塞式超时操作,也就是所谓的任务最大时长
* dispatch_enter和dispatch_leave要成对出现 */
这里需要注意一下,要将dispatch_group_enter和dispatch_group_leave结对使用
- (void)testDispatch_group {
//创建
dispatch_queue_t quete = dispatch_queue_create("baby", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
NSLog(@"使用dispatch_group1进行网络请求:%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
sleep(2);
// dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)));
NSLog(@"队列1完成任务1:%@", [NSThread currentThread]);
}); dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
NSLog(@"使用dispatch_group2进行网络请求:%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
sleep(2);
NSLog(@"完成任务2:%@", [NSThread currentThread]);
}); dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
NSLog(@"使用dispatch_group3进行网络请求:%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
sleep(2);
NSLog(@"完成任务3:%@", [NSThread currentThread]);
});
sleep(2);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"最后执行 ---- %@", [NSThread currentThread]);
}); }
总结的也不一定全面,如有什么疑问,请加我扣扣:1123231279私聊我即可。
传送门:点击打开链接
iOS dispatch_semaphore_t(信号量)和 2.dispatch_group_t (组)的更多相关文章
- ios开发GCD(2)-dispatch_semaphore_t信号量计数器
思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办? dispatch_semaphore_t 看代码解析: NSLog(@"开始"); dispatch_ ...
- FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组,任务消息邮箱
以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Not ...
- GCD使用dispatch_semaphore_t创建多线程网络同步请求
一.简介: dispatch_semaphore_t:表示信号,生成信号的方法是 dispatch_semaphore_t semaphore= dispatch_semaphore_create(0 ...
- iOS 多线程之线程锁Swift-Demo示例总结
线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...
- iOS开发系列-Lock
概述 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. iOS中锁之前的性能的图标排行: ...
- μC/OS-II 信号量集
简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...
- 16.2-uC/OS-III同步 (事件标志组)
事件标志组 1.当任务要与多个事件同步时可以使用事件标志.若其中的任意一个事件发生时任务被就绪, 叫做逻辑或(OR).若所有的事件都发生时任务被就绪,叫做逻辑与( AND). 2.用户可以创建任意个事 ...
- Linux多线程编程-信号量
在Linux中.信号量API有两组.一组是多进程编程中的System V IPC信号量.另外一组是我们要讨论的POSIX信号量. 这两组接口类似,但不保证互换.POSIX信号量函数都已sem_开头,并 ...
- 【DSP开发】硬件信号量在多核处理器核间通信中的应用
硬件信号量在多核处理器核间通信中的应用 刘德保1,汪安民1,韩道文2 1.同方电子科技有限公司研究所,九江 332009:2.解放军电子工程学院 摘要: 在多核处理器的软件设计中,核间通信机制是关键所 ...
随机推荐
- Vim 简明教程【转载】
简明 Vim 练级攻略 第一级 – 存活 安装 vim 启动 vim 什么也别干!请先阅读 当你安装好一个编辑器后,你一定会想在其中输入点什么东西,然后看看这个编辑器是什么样子.但vim不是这样的,请 ...
- php进阶--菜鸟之路
希望有所帮助! 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的PHP开发:能够在P ...
- 变量 range while for input
1.程序 =数据结构+算法 1.1.数字计算机的编码指令的次序 1.4.程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行操作的一系列语句和指 ...
- 2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...
- 自学web前端能不能找到一份前端的工作吗
关于自学web前端能不能通过社招找到一份互联网公司web前端开发的工作,有无数的人问出这样的问题,答案没有标准的,只能从概率去考虑.有的人可以,有的人不可以,有的人自学就业的概率就是高,有的概率就是低 ...
- Java线程池应用及原理分析(JDK1.8)
目录 一.线程池优点 二.线程池创建 三.任务处理流程 四.任务缓存队列及排队策略 五.任务拒绝策略 六.线程池关闭 七.线程池实现原理 八.静态方法创建线程池 九.如何确定线程池大小 一.线程池优点 ...
- Django11-ModelForm
一.定义ModelForm类 # 创建部门表单校验 class DepartmentForm(forms.ModelForm): class Meta: model = models.Departme ...
- 用es5原生模仿-es6Promise异步处理
用es5原生模仿-es6Promise异步处理,不过在处理异常的时候有点小bug不是很完美,不过多级then 是没问题的和resolve, rejec 正常调用和异常处理调用是没问题的.本帖属于原创 ...
- jquery中text、html的区别
- day48 前端高级选择器优先级
复习 1. 基础选择器 标签选择器(div) | 类选择器(.div1) | id选择器(#div2) <div class="div1" id="div2&quo ...