Operation Queue

一、Operation Object

Operation对象是NSOperation类实例对象,可以在operation中包含应用程序需要执行的任务,使用时需要用到NSOperation的子类。尽管NSOperation是抽象类,但它给子类提供了大量重要的基础设置,除外,Foundation框架提供了已经定义好的2个子类NSInvocationOperation、NSBlockOperation。

1、自定义NSOperation子类

可以改变默认的operation执行方式,打印它的状态等等。

1)支持operation之间存在依赖,这样operation便同步执行。

2)可以提供completion block,以便在operation的主任务完成后执行。

3)使用KVO监控并通知operation执行状态的改变。

4)提供operation优先级设置。

5)提供cancel operation操作。

2、NSInvocationOperation类

3、NSBlockOperation

二、并发/非并发Operations

尽管可以将operations添加到operation queue中,但还可以通过调用start方法来执行operation,只是start方法不保证operation能并发执行。

isConcurrent方法根据operation开始执行所在的线程是否是star方法所在的线程,返回operation是同步还是异步执行,默认返回的是NO,意味着在调用线程中同步被执行。

如果想实现异步,必须写额外代码异步开启operation。比如,需创建独立的线程,调用异步的系统功能,或者另外去确保快速开启执行任务,并在任务完成前快速返回。大多数开发者不需要实现concurrent operations对象,只需将operations添加到operation queue。

三、创建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

四、创建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.
");
      // Do some work.

}];

// addExecutionBlock:函数可以继续添加block。

If you need to execute blocks serially, you must submit them directly to the desired dispatch queue.

五、本文参考自苹果官方文档

https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1

原文地址:https://www.cnblogs.com/zhouyi-ios/p/7001011.html