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应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...
随机推荐
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- jquery mobile 前言
引用js: <link rel="stylesheet" href="../jquery.mobile-1.1.0/jquery.mobile-1.1.0.css& ...
- JSP页面同时操作所有Input输入框
项目里要写个function,对页面上所有input输入框进行非空判断,对非空input全部置为readOnly,提交的时候判断是否有空白项目. var inputs=document.getElem ...
- HTML5与CSS3权威指南.pdf5
第9章 通信API 跨文档消息传输 HTML5提供了网页文档之间互相接收与发送信息的功能,不仅同源(域+端口号)的Web网页之间可以互相通信,甚至可以实现跨域通信 想要接受从其他窗口发过来的信息,要对 ...
- Bzoj 1532: [POI2005]Kos-Dicing 二分,网络流
1532: [POI2005]Kos-Dicing Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1373 Solved: 444[Submit][St ...
- container_of宏剖析
container_of宏剖析//该宏位于include/linux/kernel.h 1.定义格式 /** * container_of - cast a member of a structure ...
- 让你的Ubuntu也能像Windows那样显示网速和CPU温度
致力于Linux桌面操作系统的平民化,一直强迫自己完全在Ubuntu系统下进行日常的电脑使用,但是用长了时间的Windows,还是有些习惯改不过来,比如只要在下载或者看在线视频的时候就会不自觉关注网速 ...
- hyperVisor
当前主要的hyperVisors:VMware vSphere.微软Hyper-V.Citrix XenServer .IBM PowerVM.Red Hat Enterprise Virtuliza ...
- Yii rabc角色权限管理文章推荐
yii的这个rbac太通用,太灵活,有时候理解起来有困难.也是初学这个,推荐一个不错的文章:http://www.yiiframework.com/wiki/136/getting-to-unders ...
- AVL树的左旋右旋理解 (转)
AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...