多线程-NSOperation
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-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下载图片思路 – 无沙盒缓存
!--EndFragment-->!--StartFragment-->!--EndFragment-->!--StartFragment-->!--EndFragment-->!--StartFragment-->!--EndFragment-->!--StartFragment-->!--EndFragment-->!--StartFragment-->!--EndFragment-->!--StartFragment-->
以上是关于多线程-NSOperation的主要内容,如果未能解决你的问题,请参考以下文章