多线程-NSOperation
NSOperation
NSOperation的使用:
NSOperation需要和和NSOperationQueue实现多线程编程
实现的具体步骤:
- 先将需要执行的操作封装到一个NSOperation对象中
- 然后将NSOperation对象添加到NSOperationQueue中
- 系统会自动将NSOperationQueue中的NSOperation取出来
- 将取出的NSOperation封装的操作放到一条新线程中执行
注意:NSOperation是一个抽象类,不具备分装操作的能力必须使用它的子类
- NSInvocationOperation
- NSBlockOperation
- 自定义子类继承NSOperation,实现内部相应的方法(-main方法)
这里介绍一下上面提到的操作 想到于GCD中的队列,封装一些你要中的事情(任务)
NSOperation各个子类的基本使用:
NSInvocationOperation
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {NSInvocationOperation *invovationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];[invovationOperation start]; }- (void)task {NSLog(@"%@", [NSThread currentThread]); }
输出结果:
2016-03-29 23:14:31.262 test1[1440:105145] <NSThread: 0x7fcba5101dc0>{number = 1, name = main}
分析,说明使用NSInvocationOperation并不会开辟子线程执行封装的任务,我们在看一下NSBlockOperation
NSBlockOperation的使用
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{for (int i = 0; i<3; i++) {NSLog(@"A------%@", [NSThread currentThread]);};}];[blockOp start];
输出结果:
2016-03-29 23:21:00.211 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main} 2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main} 2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main}
分析得到结果:NSBlockOperation单独使用也需要调用start方法,并且不会开辟子线程执行任务,但是我们看一下下面的情况,当block追加操作的时候,追加的操作会在子线程中执行并且是并发执行的
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{for (int i = 0; i<3; i++) {NSLog(@"A------%@", [NSThread currentThread]);};}]; /********************************blcokOperation追加任务********************************/[blockOp addExecutionBlock:^{for (int i = 0; i<3; i++) {NSLog(@"B------%@", [NSThread currentThread]);};}]; /********************************blcokOperation追加任务********************************/[blockOp addExecutionBlock:^{for (int i = 0; i<3; i++) {NSLog(@"C------%@", [NSThread currentThread]);};}];[blockOp start];
输出结果:
2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main}
2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}
2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)}
2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main}
2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main}
2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)}
2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}
2016-03-29 23:24:58.884 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)}
2016-03-29 23:24:58.884 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}
注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作
将操作添加进NSOperationQueue的使用
首先我们要靠接NSOperationQueue的两种类型及创建方式
NSOperationQueue *queue = [NSOperationQueue mainQueue];
注意:通过mainQueue 创建的队列中的任务,不会创建子线程,在主队列中执行
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
注意:通过alloc init的方式创建的队列会开启子线程执行任务,并且是并发执行任务的,那么我们怎么向GCD中那样让队列中的任务串行执行任务呢
那么可以以通过线面的属性来设置最大的并发数 当值为1的时候,队列会开启子线程并且是串行执行队列中的任务,在实际的开发,建议一般创建最多子线程的条数为3~5
queue.maxConcurrentOperationCount = 1;
队列的取消、暂停、恢复
操作依赖
操作的监听
自定义NSOperation
自定义NSOperation下载图片思路 – 无沙盒缓存
转载于:https://www.cnblogs.com/mshong/p/5335399.html
多线程-NSOperation相关推荐
- iOS面试题(二十五)多线程 --NSOperation和NSOperationQueueNSThread锁机制
7.多线程 GCD(使用最多) NSOperation/NSOperationQueue(AFNetworking源码中所有网络请求任务都封装到NSOperation,提交到operationQueu ...
- iOS中的多线程 NSOperation
在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ...
- ios多线程 -- NSOperation 简介
NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: 1)先 ...
- 浅谈多线程——NSOperation
iOS中多线程相关方法--NSOperation及其相关类: NSOperation NSBlockOperation NSInvocationOperation NSOperationQueue 1 ...
- ios 多线程 -- NSOperation 常用方法
1 最大并发数 最大并发数:同一时间最多只能执行的任务的个数. 最⼤大并发数的相关⽅方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMa ...
- iOS 多线程的四种技术方案
iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...
- iOS_多线程(一)
在学习多线程之前首先搞清楚以下几个问题. 并发:在同一时刻,只有一条指令被执行,多条指令进行快速切换执行. 并行:在同一时刻,多个处理器可以处理多条指令 1.什么是进程? 一个运行的程序就是一个进程或 ...
- 第一篇:NSOperation的概念
一.说明 NSOperation的作口:配合使用NSOperation和NSOperationQueue也能实现多线程 NSOperation和NSOperationQueue实现多线程的具体步骤: ...
- iOS多线程: pthread、NSThread
系列文章: 多线程 多线程 pthread.NSThread 多线程 GCD 多线程 NSOperation 多线程运用 Pthreads 这是一套在很多操作系统上都通用的多线程API, 基于 c语言 ...
最新文章
- 比特币和加密货币入门
- python快速编程入门课后题答案-python语言程序设计基础(嵩天)第四章课后习题部分答案...
- 待研究金华的存储过程
- LeetCode 379. 电话目录管理系统(哈希set)
- 南京理工大学计算机学院教师信息网,南京理工大学教师信息
- mysql密码过期问题
- 信息学奥赛C++语言:蛋糕盒子
- NB-IOT(1)---NB-IoT移远BC95调试
- 根据excel批量归类文件
- 【TensorFlow-windows】(五) CNN(卷积神经网络)对cifar10的识别
- LINUX系统下监控DELL服务器硬盘状态
- 从有赞UI组件库看CSS BEM命名规范的好处
- python 判断回文数
- 一种屏蔽win10指定更新补丁的设置方法
- emc4012光纤直连服务器,Dell EMC PowerVault ME4012存储
- Hadoop之外的3个大数据平台
- 优化MySchool数据库设计(SQL Server)
- JS 图片放大缩小、旋转
- 前端开发学习笔记(二)JavaScript DOM编程技术(一、二)
- maven打包报内存不足,配置maven vm options
热门文章
- 蛋白质导论: 结构,功能和运动,第二版 Introduction to Proteins : Structure, Function, and Motion, Second Edition
- flask+vue进阶
- 计算机网络实验二:应用层和传输层网络协议分析
- 计算机视觉与深度学习 | 复杂环境下的视觉同时定位与地图构建(SLAM)
- 虚拟机登服务器,用虚拟机登录云服务器
- VS 中配置使用Visual SVN系列 四:SVN Server配置和使用
- mysql eval,mysql中是否有类似于eval的写法的,答案在这里
- docker 查看已安装容器_WIN7下安装Docker容器
- java自动生成代码框架_DodoFramework- 一个基于代码生成引擎的Java Web系统自动化开发框架...
- Scikit-Learn 常用函数