一、NSOperation的介绍

1、NSOperation的作用

配合使用NSOperation和NSOperationQueue实现多线程编程

2、实现多线程的具体步骤

1)将需要执行的操作封装到一个NSOperation对象中

2)将NSOperation对象添加到NSOperationQueue中

3)系统自动将NSOperationQueue中的NSOperation取出来,并且将封装的操作放到一条新线程中执行

3、NSOperation十个抽象类,并没有封装操作的能力,必须使用它的子类

4、子类的三种形式

1)NSInvocationOperation

2)NSBlockOpera

3)自定义继承自NSOperation的子类,实现内部相应的方法

二、结合代码

1、NSInvocationOperation的使用

1)没有添加到队列

- (void)useNSInvocationOperation
{//1.封装操作NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil];//开始执行
    [operation1 start];NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil];[operation2 start];}
- (void)invocationTask
{NSLog(@"invocationTask,%@",[NSThread currentThread]);
}
- (void)invocationTask2
{NSLog(@"invocationTask2,%@",[NSThread currentThread]);
}

打印结果:

2016-03-14 17:53:59.638 NSoperation[3071:257804] invocationTask,<NSThread: 0x7f86fad06cb0>{number = 1, name = main}
2016-03-14 17:53:59.639 NSoperation[3071:257804] invocationTask2,<NSThread: 0x7f86fad06cb0>{number = 1, name = main}

注意事项:结果中可以看出如果没有放到队列中,默认同步执行,都在主线程。

2)添加到队列

 1 - (void)useNSInvocationOperation
 2 {
 3     //1.封装操作
 4     NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil];
 5
 6     NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil];
 7
 8     //2.创建队列
 9     NSOperationQueue * queue = [[NSOperationQueue alloc]init];
10     queue.maxConcurrentOperationCount = 2;//最大线程数:2-3最好
11
12     //3.添加操作到队列
13     [queue addOperation:operation1];
14     [queue addOperation:operation2];
15
16 }
17 - (void)invocationTask
18 {
19     NSLog(@"invocationTask,%@",[NSThread currentThread]);
20 }
21 - (void)invocationTask2
22 {
23     NSLog(@"invocationTask2,%@",[NSThread currentThread]);
24 }

打印结果:

2016-03-14 17:57:33.192 NSoperation[3083:261277] invocationTask2,<NSThread: 0x7fd9b8f07ee0>{number = 2, name = (null)}
2016-03-14 17:57:33.192 NSoperation[3083:261278] invocationTask,<NSThread: 0x7fd9b8e13210>{number = 3, name = (null)}

根据打印结果可以看出加入队列之后,系统又开启了两条线程。

2、NSBlockOperation的使用

 1 //1.封装操作
 2     NSBlockOperation * operation1 = [NSBlockOperation blockOperationWithBlock:^{
 3         NSLog(@"NSBlockOperation---operation1,%@",[NSThread currentThread]);
 4     }];
 5     //2.添加更多的操作
 6     [operation1 addExecutionBlock:^{
 7         NSLog(@"NSBlockOperation---%@",[NSThread currentThread]);
 8     }];
 9
10     [operation1 start];

输出结果:

2016-03-14 18:04:22.577 NSoperation[3105:266124] NSBlockOperation---operation1,<NSThread: 0x7f9e7850a1c0>{number = 1, name = main}
2016-03-14 18:04:22.577 NSoperation[3105:266206] NSBlockOperation---<NSThread: 0x7f9e785a4eb0>{number = 2, name = (null)}

注意事项:只要NSBlockOperation的封装操作数大于1,就会执行一部操作

3、给线程添加依赖

 1 - (void)useNSInvocationOperation
 2 {
 3     //1.封装操作
 4     NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil];
 5
 6     NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil];
 7
 8      NSInvocationOperation * operation3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask3) object:nil];
 9
10     //2.创建队列
11     NSOperationQueue * queue = [[NSOperationQueue alloc]init];
12     queue.maxConcurrentOperationCount = 3;//最大线程数:2-3最好
13
14     //2.1设置依赖
15     [operation1 addDependency:operation3];
16     [operation3 addDependency:operation2];
17
18     //3.添加操作到队列
19     [queue addOperation:operation1];
20     [queue addOperation:operation2];
21     [queue addOperation:operation3];
22
23 }
24 - (void)invocationTask
25 {
26     NSLog(@"invocationTask,%@",[NSThread currentThread]);
27 }
28 - (void)invocationTask2
29 {
30     NSLog(@"invocationTask2,%@",[NSThread currentThread]);
31 }
32 - (void)invocationTask3
33 {
34     NSLog(@"invocationTask3,%@",[NSThread currentThread]);
35 }

输出结果:

2016-03-14 18:12:21.066 NSoperation[3135:272293] invocationTask2,<NSThread: 0x7f845a54e500>{number = 2, name = (null)}
2016-03-14 18:12:21.067 NSoperation[3135:272293] invocationTask3,<NSThread: 0x7f845a54e500>{number = 2, name = (null)}
2016-03-14 18:12:21.067 NSoperation[3135:272293] invocationTask,<NSThread: 0x7f845a54e500>{number = 2, name = (null)}

根据结果可以看出先执行的2又执行的3最后执行的1,并没有根据添加到队列的顺序执行。

4、设置线程的优先级

1)operation1.queuePriority = NSOperationQueuePriorityHigh;

2)优先级的取值

NSOperationQueuePriorityVeryLow = -8L,

NSOperationQueuePriorityLow = -4L,

NSOperationQueuePriorityNormal = 0,

NSOperationQueuePriorityHigh = 4,

NSOperationQueuePriorityVeryHigh = 8

转载于:https://www.cnblogs.com/fengzhihao/p/5276675.html

iOS 之NSOperation(一)相关推荐

  1. IOS基础NSOperation的操作优先级和操作依赖

    IOS基础NSOperation的操作优先级和操作依赖 操作优先级 // ViewController.m // 34-操作优先级 // Created by 鲁军 on 2021/3/9. #imp ...

  2. 【iOS】NSOperation

    参考博客:NSOperation简介 [iOS]NSOperation, NSOperationQueue NSOperation的简单介绍 NSOperation 是居于objective-c对GC ...

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

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

  4. ios多线程 -- NSOperation 简介

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

  5. iOS面试一般性问题

    转载自:http://www.huangyibiao.com/archives/391 注意:以下问题的参考答案均为笔者所答,不代表正确,问题答案因人而异,请根据自己的实际情况回答,若认为不合理,请在 ...

  6. iOS - 学习路径图

    基础 iOS - Runtime iOS - RunLoop iOS - Block iOS - 性能优化 iOS - 内存管理 UI设计 iOS UI设计 - 设计步骤 UIKIt iOS UIKi ...

  7. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  8. iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...

  9. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇-自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  10. iOS中的多线程 NSOperation

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

最新文章

  1. JVM最多支持多少个线程?
  2. oracle导出超过100m的数据库,Oracle数据库的导出和导入
  3. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
  4. 如何在bash脚本中提示用户进行确认? [重复]
  5. mysql 远程连接
  6. 网络IPC:套接字之建立连接
  7. linux dd iflag oflag,centos – dd oflag =直接5倍速
  8. Linux系统服务之dhcp
  9. KG—ARM-Thumb子程序调用规则—ATPCS
  10. [leetcode]1.Two Sum
  11. Y400中通过easybcd在win7下面的安装Ubuntu14
  12. 项目启动报 myql字符集报错的问题
  13. 腾讯地图和百度地图经纬度的相互转换
  14. 玩转SpringCloud(F版本) 四.路由网关(zuul)
  15. 彻底解决Ubuntu18.04搜狗拼音输入法问题---支持Pycharm、WPS
  16. Deep Learning中的层结构
  17. 【前端学习-函数】js基础学习笔记
  18. Ubuntu深度学习环境部署——显卡驱动、CUDA、cuDNN、pytorch
  19. 公司常用的Project管理工具
  20. 工具综合症?资料收集狂?

热门文章

  1. NPAPI:WINDOWS中,调用函数不能阻塞
  2. 银河麒麟双击deb包无法安装
  3. 百度人脸识别文档冲突,facetype应是face_type
  4. 从山顶透过云层看城市
  5. 一个简单进程池的实现
  6. 指向Member Function的指针
  7. 学习c++ 必知三大特性
  8. c++读取文本文件里的指定位置的字符_(12)文本文件操作参考
  9. mysql指定库执行sql语句_对多个mysql的一部分库进行执行sql语句
  10. 天线远场定义_高频电磁仿真软件的选型和评估(天线、雷达、电路与器件、无线电总体等)——探讨分享,思路梳理...