1、Operation Objecthtml
Operation对象是NSOperation类实例对象,能够在operation中包含应用程序须要执行的任务,使用时须要用到NSOperation的子类。尽管NSOperation是抽象类,但它给子类提供了大量重要的基础设置,除外,Foundation框架提供了已经定义好的2个子类NSInvocationOperation、NSBlockOperation。并发
一、自定义NSOperation子类app
能够改变默认的operation执行方式,打印它的状态等等。框架
1)支持operation之间存在依赖,这样operation便同步执行。异步
2)能够提供completion block,以便在operation的主任务完成后执行。ide
3)使用KVO监控并通知operation执行状态的改变。函数
4)提供operation优先级设置。ui
5)提供cancel operation操做。spa
二、NSInvocationOperation类线程
三、NSBlockOperation
2、并发/非并发Operations
尽管能够将operations添加到operation queue中,但还能够经过调用start方法来执行operation,只是start方法不保证operation能并发执行。
isConcurrent方法根据operation开始执行所在的线程是不是star方法所在的线程,返回operation是同步仍是异步执行,默认返回的是NO,意味着在调用线程中同步被执行。
若是想实现异步,必须写额外代码异步开启operation。好比,需建立独立的线程,调用异步的系统功能,或者另外去确保快速开启执行任务,并在任务完成前快速返回。大多数开发者不须要实现concurrent operations对象,只需将operations添加到operation queue。
3、建立NSInvocationOperation
NSInvocationOperation是NSOperation的子类,经过调用指定对象的指定方法。能避免为每一个任务定义一个operation对象,尤为是修改现有应用和已经存在的对象和方法去完成必要的任务。你也能够用它根据情况改变你想调用的方法。例如,你能够用invocation operation实现根据用户输入动态选择实现的方法。
@implementation MyCustomClass - (NSOperation*)taskWithData:(id)MyData {
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:MyData]; return theOp; } // This is the method that does the actual work of the task. - (void)myTaskMethod:(id)MyData { // Perform the task. } @end
4、建立NSBlockOperation
NSBlockOperation是NSOperation的子类,它就像是包裹了一个或多个block。使用operation queue为应用提供面对对象的包裹,你能够用block operation去利用operation依赖,KVO通知,及其它dispatch queue没有的特征。
在建立block operation时至少添加一个block,而后能够根据需求增添多个blocks。当执行NSBlockOperation的时机到来,block operation提交全部的blocks至默认优先级的并发调度队列中,等待至全部的blocks结束运行。在最后一个block执行结束时,operation自己状态为finished。所以,能够用block operation去跟踪一组执行blocks,就像使用thread join去合并多个线程结果。不一样的是由于block operation自己在独立的线程中运行,在等待block operation彻底执行完毕前,应用的其它线程能够继续执行。
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{ NSLog(@"Beginning operation.\n"); // Do some work. }]; // addExecutionBlock:函数能够继续添加block。
If you need to execute blocks serially, you must submit them directly to the desired dispatch queue.
5、本文参考自苹果官方文档
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1