一、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)添加到队列

 - (void)useNSInvocationOperation
{
//1.封装操作
NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil]; NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil]; //2.创建队列
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = ;//最大线程数:2-3最好 //3.添加操作到队列
[queue addOperation:operation1];
[queue addOperation:operation2]; }
- (void)invocationTask
{
NSLog(@"invocationTask,%@",[NSThread currentThread]);
}
- (void)invocationTask2
{
NSLog(@"invocationTask2,%@",[NSThread currentThread]);
}

打印结果:

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.封装操作
NSBlockOperation * operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation---operation1,%@",[NSThread currentThread]);
}];
//2.添加更多的操作
[operation1 addExecutionBlock:^{
NSLog(@"NSBlockOperation---%@",[NSThread currentThread]);
}]; [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、给线程添加依赖

 - (void)useNSInvocationOperation
{
//1.封装操作
NSInvocationOperation * operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask) object:nil]; NSInvocationOperation * operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask2) object:nil]; NSInvocationOperation * operation3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationTask3) object:nil]; //2.创建队列
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = ;//最大线程数:2-3最好 //2.1设置依赖
[operation1 addDependency:operation3];
[operation3 addDependency:operation2]; //3.添加操作到队列
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3]; }
- (void)invocationTask
{
NSLog(@"invocationTask,%@",[NSThread currentThread]);
}
- (void)invocationTask2
{
NSLog(@"invocationTask2,%@",[NSThread currentThread]);
}
- (void)invocationTask3
{
NSLog(@"invocationTask3,%@",[NSThread currentThread]);
}

输出结果:

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

iOS 之NSOperation(一)的更多相关文章

  1. iOS GCD NSOperation NSThread等多线程各种举例详解(拷贝)

    2年多的iOS之路匆匆而过,期间也拜读来不少大神的博客,近来突然为自己一直做伸手党感到羞耻,是时候回馈社会.回想当年自己还是小白的时候,照着一些iOS多线程教程学,也只是照抄,只知其然.不知其所以然. ...

  2. iOS 多线程 NSOperation、NSOperationQueue

    1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...

  3. iOS GCD NSOperation NSThread等多线程各种举例详解

    废话就不多说,直接上干货.如下图列举了很多多线程的知识点,每个按钮都写有对应的详细例子,并对运行结果进行分析,绝对拿实践结果来说话.如果各位道友发现错误之处还请指正.附上demo下载地址

  4. iOS多线程 NSOperation的用法

    上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...

  5. iOS开发-NSOperation与GCD区别

    Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop, ...

  6. iOS多线程--NSOperation 浅显易懂

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  7. IOS 多线程 NSOperation GCD

    1.NSInvocationOperation NSInvocationOperation * op; NSOperationQueue * que = [[NSOperationQueuealloc ...

  8. iOS多线程--NSOperation

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  9. iOS多线程---NSOperation的常用操作

    1.最大并发数: - (NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger) ...

  10. iOS多线程---NSOperation介绍和使用

    1.  NSOperation实现多线程编程,需要和NSOperationQueue一起使用. (1)先将要执行的操作封装到NSOperation中 (2)将NSOperation对象添加到NSOpe ...

随机推荐

  1. java-tip-Collections.synchronized系列生成的容器

    这个系列的容器,和Vector或者HashTable之流的差不多, 区别是: Vector和HashTable是在关键方法上加synchronized关键字 而 Collections.synchro ...

  2. ssh的发展历程与基本原理

    一.ssh是什么 SSH(Secure Shell)是一个提供数据通信安全.远程登录.远程指令执行等功能的安全网络协议,最初提出目的是替代非安全的Telnet.rsh.rexec等远程Shell协议. ...

  3. c++ static笔记

    [转]http://www.cnblogs.com/zi-xing/p/4590282.html static的作用 在函数体,一个被声明为static的变量,在这一函数被调用的过程里,其数值维持不变 ...

  4. Luogu 4705 玩游戏

    看见这个题依稀想起了$5$月月赛时候的事情,到现在仍然它感觉非常神仙. 游戏$k$次价值的期望答案 $$ans_k = \frac{1}{nm}\sum_{i = 1}^{n}\sum_{j = 1} ...

  5. code1064 虫食算

    dfs搜索每个字母对应的数字 剪枝: 1.当一列上三个数a b c都已知时,如果 (a+b)%n!=c && (a+b+1)%n!=c 剪枝(+1是考量进位,注意&&) ...

  6. linux ubuntu 各目录大小

    /home 45k /bin 8.7M /lib 370M /mnt 4.1k /run 36k /sbin 11M /tmp 41k /usr/share 770M

  7. centos踩坑指南之安装composer

    composer是php的一个依赖管理器,那么安装composer可以快速编译php 但是在centos7以上 安装composer的有一个步骤有个小问题 对于centos6来说是 sudo mv c ...

  8. python列表技巧

    1.访问列表元素 test1 = ["chengqian","and","what"] print(test1[0])#第一个元素 prin ...

  9. NIOS II SOPC系统自定义IP常见知识点总结

    封装IP1.将写好的Verilog代码添加在Quartus工程中,IP目录下,(如果没有,自己建一个)2.打开Qsys工具,选择New Component3.name和Display name输入合理 ...

  10. hadoop大致问题

    一.项目编码实现 HDFS文件上传 HDFS文件下载 定位文件读取 通过API操作HDFS 通过IO流操作HDFS HDFS写数据流程 HDFS读数据流程 统计一堆文件中单词出现的个数(WordCou ...