深入学习NSOperationQueue

来源:互联网 发布:php获取数组第一个key 编辑:程序博客网 时间:2024/05/26 20:21

目前在 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
0 0