简介
- NSOperationQueue(操作队列)是由GCD提供的队列模型的Cocoa抽象,是一套Objective-C的API。
- GCD提供了更加底层的控制,而操作队列则在GCD之上实现了一些方便的功能,这些功能对于开发者来说通常是最好最安全的选择。
一、队列及操作
- NSOperationQueue有两种不同类型的队列,主队列和自定义队列。
(1)主队列运行在主线程上。
(2)自定义队列在后头执行。 - 队列处理的任务是NSOperation的子类
(1)NSInvocationOperation
(2) NSBlockOperation
二、基本使用步骤
- 定义操作队列
- 定义操作
- 将操作添加到队列中
三、demo
(1) NSInvocationOperation(调度操作)
- (void) invocationOpertion
{
//定义队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//定义操作并添加到队列
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operatioAction) object:nil];
[queue addOperation:op];
}
- (void) operatioAction
{
NSLog(@"今天是个好日子!=====%@",[NSThread currentThread]);
}
输出:
2016-04-14 16:41:04.659 OperationTest[28735:1426089] 今天是个好日子!=====<NSThread: 0x7fc7a870b1e0>{number = 2, name = (null)}
总结:可以看出,开启了一个新线程。NSInvocationOperation优点:可以传一个参数,但是需要一个被调度的方法。
(2)NSBlockOperation(块操作)
- (void) blockOperation
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"今天是个好日子=====%@", [NSThread currentThread]);
}];
[queue addOperation:op];
}
总结:块操作比较灵活,代码都在一起,方便使用,方便阅读。
(3)设置操作的依赖关系(addDependency)
- (void) addDependency
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片1=====%@", [NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片2=====%@", [NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片3=====%@", [NSThread currentThread]);
}];
[op2 addDependency:op1];
[op3 addDependency:op2];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
}
输出:
2016-04-14 16:51:41.513 OperationTest[28894:1433850] 下载图片1=====<NSThread: 0x7fa7027045f0>{number = 2, name = (null)}
2016-04-14 16:51:41.515 OperationTest[28894:1433863] 下载图片2=====<NSThread: 0x7fa70241d6c0>{number = 3, name = (null)}
2016-04-14 16:51:41.515 OperationTest[28894:1433863] 下载图片3=====<NSThread: 0x7fa70241d6c0>{number = 3, name = (null)}
总结:添加依赖关系,可以设置操作的执行顺序,否则执行的结果是无序的。但是注意不要出现循环依赖。
(4)设置同时并发的线程数量
- (void) maxCurrentOperation
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:2];
for (int i = 0; i<10; i++) {
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"你好====%@", [NSThread currentThread]);
}];
[queue addOperation:op];
}
}
优点:设置同时并发线程的数量可以有效的降低CPU的负担和内存开销。
从本质上来看,操作队列的性能会比GCD略低,不过,大多数情况下这点负面影响可以忽略不计,操作队列是并发编程的首选工具。AFN底层就是用的GCD开发,开发的接口是NSOperation。
今天的介绍就到这里,欢迎大家吐槽。