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.解放军电子工程学院 摘要: 在多核处理器的软件设计中,核间通信机制是关键所 ...
随机推荐
- js,jquery分别怎么判断页面元素是否存在
1JS判断方法:if(document.getElementById("XXX")){ console.log("存在") } 2Jquery判断方法:if ...
- zookeeper、solrcloud、rediscluster集群解决方案
集群解决方案 课程目标 目标1:说出什么是集群以及与分布式的区别 目标2:能够搭建Zookeeper集群 目标3:能够搭建SolrCloud集群 目标4:能够搭建RedisCluster集群 ...
- php通过imap获取腾讯企业邮箱信息后的解码处理
最近需要在项目开发的oa中集成一个收发腾讯企业邮箱邮件的功能,今天做到了获取收件箱内容部分,imap如何获取就不写了,百度一堆,主要是关于内容的解码 主要以邮件主题解码为主,腾讯企业邮返回的数据主要有 ...
- Working with Excel Files in Python
Working with Excel Files in Python from: http://www.python-excel.org/ This site contains pointers to ...
- Dear Menuhin
2017-11-26 Sa Nov 11:05 AM @ HOME, TOSBE Nicole assigned us a composition about the Thanksgiving day ...
- Java & C# BCD编码与十进制转换
using System;using System.Collections.Generic;using System.Text; namespace Base{ public class BCDHel ...
- Tomcat的三种安装方式:解压版、安装版、配置成Windows服务版
https://blog.csdn.net/Jessica_XLF/article/details/81711429
- jmiter性能测试
1. Jmeter简介Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测 ...
- Python数据分析学习(一):Numpy与纯Python计算向量加法速度比较
import sys from datetime import datetime import numpy as np def numpysum(n): a = np.arange(n) ** 2 b ...
- rancher2.1.7安装nfs 存储类
NFS存储类不建议作大规模存储,块存储建议采用CEPH(独立安装) NFS只作为外接存储与普通NGINX类的配置文件,业务配置文件建议走配置中心. 增加自定义商店 地址为:https://github ...