简介
NSOperationQueue是一种面向对象的处理线程工作的技术,在gcd 式的函数式编程上进行的封装,并联合kvo 对一些状态做了监听,同时加入了依赖等操作,使得开发中在操作程序流程控制上更加省事。
NSOperation的操作类
1. NSOperation
这个类是用于定义自定义操作对象的基类,子类化NSOperation可以完全控制您自己的操作的实现,包括更改操作执行的默认方式并报告其状态的能力。
2.NSInvocationOperation
一个你同时使用一个或多个block对象的类。因为它可以执行多个block,block操作对象使用组语义进行操作; 只有当所有关联的block完成执行时,操作本身被认为完成。
3.NSInvocationOperation
您根据应用程序创建基于对象和选择器的操作对象的类,简言之,类似于UIbutton的target那种操作
所有操作对象都支持以下主要功能:
1,支持在操作对象之间建立基于图形的依赖关系。这些依赖关系阻止给定的操作运行,直到其所依赖的所有操作完成运行
2,支持可选的completion block,该操作在操作的主要任务完成后执行
3,支持优先操作,从而影响其相对执行顺序 也就是支持操作的优先级
4,支持 cancel setSuspended 等
5,支持使用KVO通知监视对您的操作执行状态的更改,kvo监听到你操作的进程
创建Operation对象
1. 创建NSInvocationOperation对象
- (NSOperation*)taskWithData:(id)data {
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(myTaskMethod:) object:data];
return theOp;
}
// This is the method that does the actual work of the task.
- (void)myTaskMethod:(id)data {
// Perform the task.
}
2.创建NSBlockOperation对象
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
NSLog(@"Beginning operation.\n");
// Do some work.
}];
执行Operations
到目前为止,执行操作的最简单的方法是使用作为NSOperationQueue类的一个实例的操作队列。您的应用程序负责创建和维护其打算使用的任何操作队列。应用程序可以具有任意数量的队列,但是在给定时间点可能执行多少操作有实际的限制。操作队列与系统一起工作,将并发操作数限制为适用于可用内核和系统负载的值。因此,创建其他队列并不意味着您可以执行其他操作。要创建一个队列,您可以像应用其他对象一样在应用程序中分配队列:
NSOperationQueue * aQueue = [[NSOperationQueue alloc] init];//创建队列
要将操作添加到队列中,请使用该addOperation:方法。在OS X v10.6及更高版本中,您可以使用该addOperations:waitUntilFinished:方法添加一组操作,也可以使用该方法将块对象直接添加到队列中(不带相应的操作对象)addOperationWithBlock:。这些方法中的每一个都会排队一个操作(或操作),并通知队列应该开始处理它们。在大多数情况下,在添加到队列后不久就会执行操作,但由于几个原因,操作队列可能会延迟执行排队操作。具体来说,如果排队操作依赖于尚未完成的其他操作,则可能会延迟执行。如果运行队列本身被挂起或正在执行其最大并发操作数,则执行也可能会被延迟。
// 把operation添加到队列中 的三种方式
[aQueue addOperation:anOp]; //添加单个操作
[aQueue addOperations:anArrayOfOpswaitUntilFinished:NO]; //添加多个操作
[aQueue addOperationWithBlock:^ {
/* 做一点事。* /
}];
operation之间的依赖
1.当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前NSOperation对象才会开始执行操作。注意:不要造成循环依赖 如果A依赖B, B依赖A 结果会是如何,你懂得。另外,通过removeDependency方法来删除依赖对象。
设置最大并发操作数
虽然NSOperationQueue该类是为并行执行操作而设计的,但是可以强制单个队列一次只运行一个操作。该setMaxConcurrentOperationCount:方法允许您配置操作队列对象的最大并发操作数
[aQueue setMaxConcurrentOperationCount:1];//设置队列的最大并发操作数量
取消操作 和 等待操作完成
[aQueue cancelAllOperations];//取消队列里的所有操作
[operation1 cancel];//本操作取消
// 阻塞当前线程,等待queue的所有操作执行完毕
[queue waitUntilAllOperationsAreFinished];
本文只是记录了简单的使用 介绍 可参考官方文档https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1
可以看看AFN GCDAsyncSockcet 等三方库中的应用