OC - 14.NSOperation与NSOperationQueue
简介
- 通过NSOperation与NSOperationQueue的组合也能实现多线程
- 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现
NSOperation
- NSOperation是一个抽象类,不能用来直接封装操作,通常使用它的子类来封装操作
若不将NSOperation对象添加到NSOperationQueue中,操作只会在当前线程执行,且需要手动开始执行操作
NSoperation的子类
NSInvocationOperation
//创建操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
//开始执行操作
[operation start];
NSBlockOperation(当操作数大于1时,异步执行)
//创建操作
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//操作封装的任务代码
}];
//添加操作
[operation addExecutionBlock:^{
//操作封装的任务代码
}];
//开始执行操作
[operation start];
自定义子类的步骤
- 重写- (void)main方法,在该方法中封装需要执行的操作
- 在- (void)main方法中,需要自己建立自动释放池(原因:若是异步操作,无法访问主线程的自动释放池)
- 通过检查cancelled等属性,来判断操作的状态,执行相应的操作
设置操作完成时的回调
//创建操作
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
//任务代码
}];
//设置回调
operation.completionBlock = ^{
//操作完成时执行的代码
};
NSOperationQueue
作用
- 容纳需要异步执行的操作
- 系统会自动执行NSOperationQueue中的操作,不需要手动启动
NSOperationQueue的相关操作
创建操作队列
- [[NSOperationQueue alloc] init]
获取主操作队列
- + (NSOperationQueue *)mainQueue
获取当前操作队列
- + (nullable NSOperationQueue *)currentQueue
往队列中添加操作
- - (void)addOperation:(NSOperation *)op
- - (void)addOperationWithBlock:(void (^)(void))block
设置最大并发操作数
- - setMaxConcurrentOperationCount:(NSInteger)count
- 若并发操作数为1,则为串行队列
暂停/启动队列中的任务
- - setSuspended:(BOOL)b
取消队列中的任务
- - (void)cancelAllOperations
- 等到正在执行的任务执行完毕,队列才会被挂起
实现多线程的步骤
创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]
往队列中添加操作
/**
方法一
*/
//创建操作
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download为操作封装的任务方法
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
//任务代码
}];
//添加操作
[queue addOperation:operation1];
[queue addOperation:operation2];
/**
方法二
*/
//添加操作
[queue addOperationWithBlock:^{
//操作封装的任务
}];
操作依赖
作用
- 建立操作之间的执行顺序关系
- 操作依赖是面向操作的,可以跨队列建立操作之间的依赖关系
- 若要建立操作之间的依赖关系,必须在操作被添加到队列之前建立
建立操作依赖的步骤
创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]
添加操作
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
//任务1代码
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
//任务2代码
}];
建立依赖关系(必须在操作被添加到队列之前)
[operation1 addDependency:operation2];
将操作添加到队列
[queue addOperation:operation1];
[queue addOperation:operation2];
线程之间的通信
从主线程到子线程
- 从主线程到子线程的切换,通常是系统自动完成的,只需要将操作添加到队列中,系统就会根据实际需要,是否切换到子线程中执行操作
从子线程到主线程
将需要执行的操作,添加到主操作队列中即可(该操作将运行在主runLoop的common模式下)
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//需要在主线程中执行的任务代码
}];
OC - 14.NSOperation与NSOperationQueue的更多相关文章
- 用NSOperation和NSOperationQueue实现多线程编程
1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation和NS ...
- Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue
1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...
- 多线程之NSOperation和NSOperationQueue
这篇文章里我将不过多的谈及理论知识,这些东西会的自然会,不会的,看多了也是云里雾里.下面我讲更多的用代码+注释的方式来讲如何使用NSOperation和NSOperationQueue. 1.NSOp ...
- 多线程下的NSOperation和NSOperationQueue的使用
多线程下的NSOperation和NSOperationQueue的使用 NSOperation和NSOperationQueue的介绍: NSOperation是Cocoa中的一个抽象类,用来封装单 ...
- iOS 多线程 NSOperation、NSOperationQueue
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...
- NSOperation、NSOperationQueue(III)
NSOperation.NSOperationQueue 常用属性和方法归纳 NSOperation 常用属性和方法 a. 取消操作方法 //可取消操作,实质是标记 isCancelled 状态. - ...
- NSOperation、NSOperationQueue(II)
NSOperationQueue 控制串行执行.并发执行 NSOperationQueue 创建的自定义队列同时具有串行.并发功能 这里有个关键属性 maxConcurrentOperationCou ...
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
(1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...
随机推荐
- Team Foundation Server操作说明
目录 一. Visual Studio 2010团队协作管理 1.1团队模型及角色 1.1.1创建角色 1.1.2创建工作组 1.1.3工作组成员及权限 1.2团队成员利用VS2010实现协同办公 1 ...
- 算法 python实现(三) 快速排序
算法学起来真费劲啊,智商只够捉只鸡的.昨晚没看明白就没电了,过两天要考虑偷电了... 今天看看快速排序,有一个博客写的很好,通俗生动形象,适合我这样的算法大白菜.推荐一下 http://www.cnb ...
- Apache.NMS.Stomp 下载
最近项目中有用到ActiveMQ, MQ服务器61613的端口是用的STOMP协议, 原来项目中有使用MQ, 但发现缺少Apache.NMS.Stomp.dll的引用,于是上官网上找,结果发现所有的A ...
- [并发编程]使用线程安全队列和条件变量的notify来安排分步骤任务
// 方法1:直接构建N个THread来run foreach (i, size) { thread trd(&Instance::doWork, &inst); lstTrd.pus ...
- 对 Linux 初级、中级、高级用户非常有用的 60 个命令
对 Linux 初级.中级.高级用户非常有用的 60 个命令 初级篇: 你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现在我的世界里了. ...
- Poj 1151-Atlantis 矩形切割
题目:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- usaco 奶牛接力
Description 为增强体质,约翰决定举办一场奶牛接力跑比赛.比赛现场有一些接力位置,这些位置间有T条路连接,第i条路的长度为Li. 有N头奶牛需要参加比赛,领头的奶牛从位置S出发,她会按照你的 ...
- hdoj1754 I Hate It【线段树区间最大值维护+单点更新】
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- ReactiveCocoa框架学习2
昨天内容回顾 信号类:表示有数据产生,信号类不发送数据 注意:不同的信号,订阅方式不同 RACSignal 创建RACDynamicSignal信号 -> didSubscribe(block) ...
- nginx日志格式含义