深入学习NSOperationQueue

目前在 iOS 有两套先进的多线程同步 API 可供我们使用NSOperation 和 GCD 。其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API。

为何推荐NSOperationQueue

如果GCD那么我们的网络请求数据的方法应该是这样的

dispatch_async(_Queue, ^{

  //请求数据
  NSData *data = [NSData dataWithContentURL:[NSURL URLWithString:@"http://domain.com/a.png"]];

    dispatch_async(dispatch_get_main_queue(), ^{
//回去主线程刷新UI

    });
});

整体来说代码简洁度看着还是比较优雅,但是仔细看就会发现,本请求是无法cancel的,紧接而来的蛋疼问题就多了你觉得呢?

那么我们就需要解决这令人上火的问题,自然NSOprationQueue就成了GCD的替代品,那么NSOprationQueue的优势到底在哪里?

优势:

  1. 可以取消一个执行的NSOperation
  2. 可以很方便的添加任务的依赖关系
  3. 提供了各个人的的当前状态

NSOperationQueue的使用

NSOperationQueue有两种不同的队列

  1. 自定义队列
  2. 主队列

自定义队列在后台执行,主队列在主线程执行 任务队列有两种:

  • NSBlockOperation
  • NSInvocationOperation

他们都继承自 NSOperation。他们的用法应该是这样的:

*NSBlockOperation*

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
               //任务执行
            }];
[queue addOperation:operation];

* NSInvocationOperation*

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_SEL) object:nil];
[queue addOperation:operation];

Queue的一个属性maxConcurrentOperationCount ,我们可以通过设这个数来限制queue的并行还是串行队列,当maxConcurrentOperationCount = 1时候为串行队列,否则为并行队列。

NSOperation

如果我们用这个就必须继承自NSOperation,然后重写main方法,顺便有个更为令人惊喜的事情就是,重写的NSOperation是可以cancel掉正在执行的Operation的,这样就便于我们操作NSOperation的各种非正常状态如:莫名卡死之类的BUG

使用 main 方法非常简单,开发者不需要管理一些状态属性当 main 方法返回的时候,这个 operation 就结束了。

@implementation YourOperation
- (void)main
{
 @autoreleasepool {

       // 任务代码 ...  
    }

}
@end

你可能感兴趣的:(iOS)