目前在 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的优势到底在哪里?
优势:
- 可以取消一个执行的NSOperation
- 可以很方便的添加任务的依赖关系
- 提供了各个人的的当前状态
NSOperationQueue的使用
NSOperationQueue有两种不同的队列
- 自定义队列
- 主队列
自定义队列在后台执行,主队列在主线程执行 任务队列有两种:
- 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
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 08:54:19