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 ...
随机推荐
- CNN中已知input_size、kernel_size、padding、stide计算output公式的理解
在进行卷积运算和池化的时候,对于输入图像大小为input_size,给定kernel_size.padding.stride,计算得出output_size为: output_size =1+ (in ...
- C#ActiveX安装项目
C#开发的ActiveX控件发布方式有三种: 制作客户端安装包,分发给客户机安装: 制作在线安装包,客户机联机安装: 使用html中object的codebase指向安装包地址. 以下为制作安装包: ...
- input标签获取焦点时文本框内提示信息清空背景颜色发生变化
<input type="text" id="username" onfocus="myFocus(this,'#f4eaf1')" ...
- experss 做小型服务器出现跨域问题
情况是这样的 我用express做一个小型的服务器来做我demo项目的一个接口 然后我就出现了跨域问题 然后我就 app.all('/*', function(req, res, next) { // ...
- QT中循环显示图片和简单的显示图片
请关注我的github https://github.com/linqiaozhou 以下实例代码不久后将会上传到我的github 这是我最近一个项目中的部分代码 //以下是简单的在QT中显示图片的代 ...
- react初体验
function Guest() { return ( <h1>pls login in</h1> ); } function User() { return ( <h1 ...
- 关于云平台中OFFICE预览与视频预览的解决办法
最近,随着firefox x64的升级,出现flash插件完全被禁止的现象,html5替换是大势所趋,原来我们在云平台中有多处使用flash的地方,比如OFFICE预览,视频播放,游戏等,现对于OFF ...
- Win7下安装Oracle 10g
首先下对版本,Oracle 10g支持Win7版(32位): 10203_vista_w2k8_x86_production_db.zip 10203_vista_w2k8_x86_productio ...
- CentOS7.5安裝配置多协议下载器Aria2
一.搭建 Aria2 以及 AriaNg Web UI 使用Docker构建的Aria2 参考 aria2-ariang-docker 以及 aria2-ariang-x-docker-compose ...
- lr计算程序执行消耗时间的比较:
去除程序执行的两种方式: 1.通过一个事务:在需要消除的代码段,使用lr_wasted_time(wasteTime); querySubmit() { char newStr4[10000]=&qu ...