一、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. 86. Partition List (List)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  2. Renderer.materials 和sharedMaterials一些用法上的区别

    Not allowed to access Renderer.materials on prefab object. Use Renderer.sharedMaterials insteadUnity ...

  3. iOS 导航栏黑线,UIImage 枚举处理方式

      ios 找出导航栏下面的黑线(可隐藏,改变样式等) http://www.jianshu.com/p/effa4a48f1e3     设置UIImage的渲染模式:UIImage.renderi ...

  4. 《Android Studio实用指南》7.1 AndroidStudio代码检查工具概述

    本文节选自<Android Studio实用指南> 作者: 毕小朋 目前本书已上传到百度阅读, 在百度中搜索[Anroid Studio实用指南]便可以找到本书. Android Stud ...

  5. 377. Combination Sum IV 返回符合目标和的组数

    [抄题]: Given an integer array with all positive numbers and no duplicates, find the number of possibl ...

  6. ansible playbook模式及语法

    一.什么是playbook及其组成 什么是playbook playbook 翻译过来就是"剧本" playbook的组成 play:定义的是主机的角色 task:定义的是具体执行 ...

  7. SpringBoot自定义拦截器实现

    1.编写拦截器实现类,此类必须实现接口   HandlerInterceptor,然后重写里面需要的三个比较常用的方法,实现自己的业务逻辑代码 如:OneInterceptor package com ...

  8. opencv cv::imageshow 不加waitKey()不能显示图片

    官方解释是highgui 没有给imshow绘制处理的时间.需要在imshow添加waitKey() waitKey()单位是ms

  9. HDFS Hbase

    Hbase:Hbase是Hadoop的数据库,是bigtable的实现,基于HDFSHDFS:文件系统,是gfs的实现 Hive,Hbase,HDFS等之间的关系Hive:Hive不支持更改数据的操作 ...

  10. Ubuntu14.04 下安装Vmware-Tools

    1.切换到ubuntu 图形界面 startx , 点击虚拟机菜单栏-安装VMware Tools 2. 在Ubuntu系统中找到VMwareTools-9.2.2-893683.tar.gz ,右键 ...