iOS- dispatch_semaphore和NSOperationQueue并发
并发:同一个时间内运行多个任务。又叫共行性,是指处理多个同时性活动的能力。
并行:是指两个并发的任务同时发生。
并发不一定并行,并发不一定要同时发生。
举个例子:
有两个快递分别要送到目的地,有以下两种方案:
(1)一个快递员分别把两个快递送到对应的目的地。(并发)
(2)两个快递员同时送一个快递到目的地。(并行)
在iOS中,经常可以看见有这样的需求,就是一个方法要等另外一个方法执行完毕再做相对应的处理,比如说一些网络请求,需要根据上一个请求的返回值做相对应的处理再执行第二个请求,所以我们不能让两个请求同时去请求网络。下面就记录以下通过GCD和NSOperationQueue来控制并发。
dispatch_semaphore
信号量是一个整型值并且具有初始计数值,信号量通常支持两个操作:通知和等待。当信号被通知的时候计数值会增加,当信号量在线程上等待的时候,必要的情况下线程会被阻塞掉,直至信号被通知时计数值大于0,然后线程会减少这个计数继续工作。
GCD中又3个信号量有关的操作:
dispatch_semaphore_create 信号量创建
dispatch_semaphore_signal 发送通知
dispatch_semaphore_wait 信号量等待
__block dispatch_semaphore_t sem = dispatch_semaphore_create();
dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);
dispatch_async(queue, ^{ for (int i = ; i < ; i++) {
NSLog(@"i的值是:%d",i);
} dispatch_semaphore_signal(sem);
}); dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
for (int j = ; j < ; j ++) {
NSLog(@"j的值是:%d",j);
}
运行结果是:

NSOperationQueue
在不添加依赖的情况下:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = ; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = ; i < ; i++) { NSLog(@"执行并发队列1:%d",i);
}
}]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (int i = ; i < ; i++) { NSLog(@"执行并发队列2:%d",i);
}
}]; [queue addOperation:operation1];
[queue addOperation:operation2];
运行结果:

两个NSOperation是并发打印的。
添加依赖控制后:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = ; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = ; i < ; i++) { NSLog(@"执行并发队列1:%d",i);
}
}]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (int i = ; i < ; i++) { NSLog(@"执行并发队列2:%d",i);
}
}]; [operation1 addDependency:operation2]; //添加依赖,operation1要依赖operation2才能继续执行 [queue addOperation:operation1];
[queue addOperation:operation2];
打印的结果:

iOS- dispatch_semaphore和NSOperationQueue并发的更多相关文章
- iOS GCD 与 NSOperationQueue
NSOperationQueue ios NSOperation vs. GCD StackOverflow: NSOperation vs. Grand Central Dispatch Blog: ...
- Appium IOS 使用多模拟器并发执行测试
申明一下 转载请注明出处 复制粘贴请滚蛋 !!!!!!!! 最近在是用appium进行app的并发测试,并且Android已经实现在同一台PC机使用多个模拟器并发测试的功能 这里说一句模拟器使 ...
- IOS中的多核并发编程GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...
- iOS Core data多线程并发访问的问题
大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的 ...
- 【转】Objective-C并发编程:API和挑战
并发指的是在同一时间运行多个任务.在单核CPU的情况下,它通过分时的方式实现,如果有多个CPU可用,则是真正意义上的多个任务“并行”执行了. OS X和iOS提供了多个API支持并发编程.每个API都 ...
- OC中并发编程的相关API和面临的挑战
OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...
- IOS - 总结下swift使用GCD 多线程(二)GCD和DispatchQueue
1.前言 iOS中处理多核并发的技术有两种分别是:`Grand Central Dispatch`(以下简称`GCD`)和`NSOperationQueue`框架.iOS开发的老司机们在程序开发中处 ...
- appium 并发测试
Android并发测试 Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: - ...
- Appium的前世今生
Appium的前世今生 一.什么是Appium Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台.Appiu ...
随机推荐
- Oracle 合并 merger into
merge into copy_emp1 c using employees e on (c.employee_id=e.employee_id)when matched then update ...
- python初学-列表
列表操作: 列表一般需要先调用方法后才能打印,不能直接打印调用的方法 因为列表可以修改 一般不会返回一个新列表 # 列表 # new_names = ['lzc','lzc2','lzc3'] # 下 ...
- java的IO流之字符流
# 原创,转载请留言联系 输出流 FileWriter类 常见的构造方法: FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象.Fil ...
- 用淘宝镜像cnpm代替npm
安装淘宝镜像cnpm: $ sudo npm install -g cnpm --registry=https://registry.npm.taobao.org 然后就大部分可以用cnpm来代替np ...
- 接口测试Session/Cookie笔记(二)
Windows系统运行计算器命令:calc python显示上一步操作命令:Alt+p python显示上一步操作结果:_(英文下划线) Session是存放在服务器的键值对 ,用于保存客户端的某个特 ...
- hdu 1853(拆点判环+费用流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- Go语言中的匿名函数和闭包的样子
1). 函数也是值,可以像普通值那样,传来传去: 2). 匿名函数: 3). 函数的类型,类似于:func(float64,float64) float64 ===================== ...
- hdu 多校第一场
1001 思路:打表可以发现只有3|n 和 4|n 的情况有解,判一下就好啦. #include<bits/stdc++.h> #define LL long long #define f ...
- oracle 11g安装教程
oracle 11g安装教程 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 第10步 第11步 第12步 第13步 第14步 第15步 第16步 第17步 第18步 第19步 ...
- Ubuntu 虚拟机增强包下载
https://www.virtualbox.org/wiki/Download_Old_Builds_5_1 Extension Pack All Platforms 安装方法详情:https:// ...