NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的。但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装。
一、NSOperation与GCD的比较
GCD是基于c的底层api,NSOperation属于object-c类。ios首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现的。
GCD优点:GCD主要与block结合使用。代码简洁高效。执行效率稍微高点。
NSOperation相对于GCD:
1,NSOperation拥有更多的函数可用,具体查看api。NSOperationQueue 是在GCD基础上实现的,只不过是GCD更高一层的抽象。
2,在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。
3,NSOperationQueue支持KVO。可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)
4,GCD 只支持FIFO 的队列,而NSOperationQueue可以调整队列的执行顺序(通过调整权重)。NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。
使用NSOperation的情况:各个操作之间有依赖关系、操作需要取消暂停、并发管理、控制操作之间优先级,限制同时能执行的线程数量.让线程在某时刻停止/继续等。
使用GCD的情况:一般的需求很简单的多线程操作,用GCD都可以了,简单高效。
从编程原则来说,一般我们需要尽可能的使用高等级、封装完美的API,在必须时才使用底层API。
当需求简单,简洁的GCD或许是个更好的选择,而Operation queue 为我们提供能更多的选择。
二、NSOperation的简单操作
•
NSOperation(
操作
)
配
NSoperationQueue(
队列
)
来实现多线程
.
•
没有像
GCD
一样串行并行什么的
,
直接拿来就能用
.
•操作依赖:NSOperation可以通过设置依赖来保证执行顺序.某一个操作的执行, 必须等待另一个操作完成才会继续执行.
使用:[op1 addDependency:op2] 依赖关系可以跨队列指定的.(不能弄成循环依赖)
•可以指定队列的优先级。
使用NSOperation的方法(3者是等价的)
:(注意NSOperation是抽象类, 必须使用他的子类才能实现)
•方法1、用NSOperation的子类NSInvocationOperation来创建操作.
•方法2、用NSOperation的子类NSBlockOperation来创建操作. (与前者效果一样)
•方法3、直接弄个队列(可以是主队列,先跑起来),再addOperationWithBlock更加简便.
•方法4、直接自定义NSOperation,实现相应的方法。
实现NSOperation的方法,以及挂起、暂停,设置最大并发数,设置依赖关系等
。
- @interface XNViewController ()
-
- @property (nonatomic, strong) NSOperationQueue *queue;
- @end
-
- @implementation XNViewController
-
-
- - (NSOperationQueue *)queue
- {
- if (!_queue) _queue = [[NSOperationQueue alloc] init];
- return _queue;
- }
-
-
-
- - (IBAction)pause
- {
-
- if (self.queue.operationCount == 0) {
- NSLog(@"没有操作");
- return;
- }
-
-
-
- if (!self.queue.isSuspended) {
- NSLog(@"暂停");
- [self.queue setSuspended:YES];
- } else {
- NSLog(@"已经暂停");
- }
- }
-
-
- - (IBAction)resume
- {
-
- if (self.queue.operationCount == 0) {
- NSLog(@"没有操作");
- return;
- }
-
-
- if (self.queue.isSuspended) {
- NSLog(@"继续");
- [self.queue setSuspended:NO];
- } else {
- NSLog(@"正在执行");
- }
- }
-
-
-
- - (void)opDemo6
- {
- NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"正在下载苍老师全集 。。。 %@", [NSThread currentThread]);
- }];
-
- NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"正在解压缩苍老师全集。。。 %@", [NSThread currentThread]);
- }];
-
- NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"正在保存到磁盘 。。。 %@", [NSThread currentThread]);
- }];
-
- NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"下载完成 。 %@", [NSThread currentThread]);
- }];
-
-
-
- [op2 addDependency:op1];
- [op3 addDependency:op2];
- [op4 addDependency:op3];
-
-
-
- [self.queue addOperation:op1];
- [self.queue addOperation:op2];
- [self.queue addOperation:op3];
-
- [[NSOperationQueue mainQueue] addOperation:op4];
- }
-
-
- - (void)opDemo5
- {
-
-
-
-
-
-
-
-
-
- self.queue.maxConcurrentOperationCount = 1;
-
- for (int i = 0; i < 10; i++) {
- [self.queue addOperationWithBlock:^{
-
- NSLog(@"正在下载 %@ %d", [NSThread currentThread], i);
- }];
- }
- }
-
-
- - (void)opDemo4
- {
-
- NSBlockOperation *op = [[NSBlockOperation alloc] init];
-
-
- self.queue.maxConcurrentOperationCount = 2;
-
-
- [op addExecutionBlock:^{
- NSLog(@"下载苍老师全集1 %@", [NSThread currentThread]);
- }];
-
-
- [op addExecutionBlock:^{
- NSLog(@"下载苍老师全集2 %@", [NSThread currentThread]);
- }];
-
-
- [op addExecutionBlock:^{
- NSLog(@"下载苍老师全集3 %@", [NSThread currentThread]);
- }];
-
-
- [op addExecutionBlock:^{
- NSLog(@"下载苍老师全集4 %@", [NSThread currentThread]);
- }];
-
-
- [op addExecutionBlock:^{
- NSLog(@"下载苍老师全集5 %@", [NSThread currentThread]);
- }];
-
-
-
-
-
-
- [self.queue addOperation:op];
- }
-
-
- - (void)opDemo3
- {
-
- for (int i = 0; i < 10; i++) {
- [self.queue addOperationWithBlock:^{
- NSLog(@"下载开始 %@ - %@", [NSThread currentThread], @(i));
- }];
- }
-
-
- [[NSOperationQueue mainQueue] addOperationWithBlock:^{
- NSLog(@"下载开始 %@ - %@", [NSThread currentThread], nil);
- }];
- }
-
-
- - (void)opDemo2
- {
- for (int i = 0; i < 10; i++) {
-
- NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"下载开始 %@ - %@", [NSThread currentThread], @(i));
- }];
-
-
- [self.queue addOperation:op1];
- }
- }
-
-
- - (void)opDemo1
- {
- for (int i = 0; i < 10; i++) {
- NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@(i)];
-
-
-
-
- [self.queue addOperation:op1];
- }
- }
-
- - (void)download:(id)obj
- {
- NSLog(@"下载开始 %@ - %@", [NSThread currentThread], obj);
- }
- @end
自定义NSOperation
:
1、继承NSOperation
2、重新main方法
- @interface XNMyOperation : NSOperation
-
- @end
-
-
-
- @implementation XNMyOperation
-
-
- - (void)main
- {
-
- @autoreleasepool {
-
- }
- }
-
- @end
参考:
http://jianshu.io/p/d09e2638eb27
http://blog.csdn.net/hufengvip/article/details/11806897
http://blog.csdn.net/vieri_ch/article/details/21937859
apple官方文档
转载请注明出处:http://blog.csdn.net/xn4545945