NSOperation

NSOperation的使用:

    NSOperation需要和和NSOperationQueue实现多线程编程

  实现的具体步骤:

  1. 先将需要执行的操作封装到一个NSOperation对象中
  2. 然后将NSOperation对象添加到NSOperationQueue中
  3. 系统会自动将NSOperationQueue中的NSOperation取出来
  4. 将取出的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追加操作的时候,追加的操作会在子线程中执行并且是并发执行的

注意:
默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作 并且内部会调用start方法
  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相关推荐

  1. iOS面试题(二十五)多线程 --NSOperation和NSOperationQueueNSThread锁机制

    7.多线程 GCD(使用最多) NSOperation/NSOperationQueue(AFNetworking源码中所有网络请求任务都封装到NSOperation,提交到operationQueu ...

  2. iOS中的多线程 NSOperation

    在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ...

  3. ios多线程 -- NSOperation 简介

    NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: 1)先 ...

  4. 浅谈多线程——NSOperation

    iOS中多线程相关方法--NSOperation及其相关类: NSOperation NSBlockOperation NSInvocationOperation NSOperationQueue 1 ...

  5. ios 多线程 -- NSOperation 常用方法

    1 最大并发数 最大并发数:同一时间最多只能执行的任务的个数. 最⼤大并发数的相关⽅方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMa ...

  6. iOS 多线程的四种技术方案

    iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...

  7. iOS_多线程(一)

    在学习多线程之前首先搞清楚以下几个问题. 并发:在同一时刻,只有一条指令被执行,多条指令进行快速切换执行. 并行:在同一时刻,多个处理器可以处理多条指令 1.什么是进程? 一个运行的程序就是一个进程或 ...

  8. 第一篇:NSOperation的概念

    一.说明 NSOperation的作口:配合使用NSOperation和NSOperationQueue也能实现多线程 NSOperation和NSOperationQueue实现多线程的具体步骤: ...

  9. iOS多线程: pthread、NSThread

    系列文章: 多线程 多线程 pthread.NSThread 多线程 GCD 多线程 NSOperation 多线程运用 Pthreads 这是一套在很多操作系统上都通用的多线程API, 基于 c语言 ...

最新文章

  1. 比特币和加密货币入门
  2. python快速编程入门课后题答案-python语言程序设计基础(嵩天)第四章课后习题部分答案...
  3. 待研究金华的存储过程
  4. LeetCode 379. 电话目录管理系统(哈希set)
  5. 南京理工大学计算机学院教师信息网,南京理工大学教师信息
  6. mysql密码过期问题
  7. 信息学奥赛C++语言:蛋糕盒子
  8. NB-IOT(1)---NB-IoT移远BC95调试
  9. 根据excel批量归类文件
  10. 【TensorFlow-windows】(五) CNN(卷积神经网络)对cifar10的识别
  11. LINUX系统下监控DELL服务器硬盘状态
  12. 从有赞UI组件库看CSS BEM命名规范的好处
  13. python 判断回文数
  14. 一种屏蔽win10指定更新补丁的设置方法
  15. emc4012光纤直连服务器,Dell EMC PowerVault ME4012存储
  16. Hadoop之外的3个大数据平台
  17. 优化MySchool数据库设计(SQL Server)
  18. JS 图片放大缩小、旋转
  19. 前端开发学习笔记(二)JavaScript DOM编程技术(一、二)
  20. maven打包报内存不足,配置maven vm options

热门文章

  1. 蛋白质导论: 结构,功能和运动,第二版 Introduction to Proteins : Structure, Function, and Motion, Second Edition
  2. flask+vue进阶
  3. 计算机网络实验二:应用层和传输层网络协议分析
  4. 计算机视觉与深度学习 | 复杂环境下的视觉同时定位与地图构建(SLAM)
  5. 虚拟机登服务器,用虚拟机登录云服务器
  6. VS 中配置使用Visual SVN系列 四:SVN Server配置和使用
  7. mysql eval,mysql中是否有类似于eval的写法的,答案在这里
  8. docker 查看已安装容器_WIN7下安装Docker容器
  9. java自动生成代码框架_DodoFramework- 一个基于代码生成引擎的Java Web系统自动化开发框架...
  10. Scikit-Learn 常用函数