ios学习笔记——操作队列NSOperation的基本操作
1、设置操作对象之间的依赖
一个对象依赖于另一个对象,就说明该对象不能执行直到另一个对象执行完毕。
我们使用NSOperation对象的addDependency:方法来给两个对象之间添加依赖关系。此方法为当前对象建立一个单向依赖关系,参数为指定的目标操作对象。这种依赖关系意味着当前的对象不能开始执行,知道目标对象完成操作。这种依赖关系也不限于在同一队列中。但是我们不能在操作对象中建立循环依赖关系。
我们应该总是添加依赖关系在操作对象运行之前或者将它们添加到一个操作队列之前。在之后添加的依赖,可能不会阻止一个给定的对象的运行。
1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 12 NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runOperation) object:nil]; 13 14 NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{ 15 NSThread * thread = [NSThread currentThread]; 16 NSLog(@"NSBlockOperation1--%@", thread); 17 }]; 18 19 [op2 addExecutionBlock:^{ 20 NSThread * thread = [NSThread currentThread]; 21 NSLog(@"NSBlockOperation2--%@", thread); 22 }]; 23 24 [op1 addDependency:op2]; 25 26 NSOperationQueue * queue = [[NSOperationQueue alloc] init]; 27 [queue addOperation:op2]; 28 [queue addOperation:op1]; 29 } 30 31 - (void)runOperation 32 { 33 NSThread * thread = [NSThread currentThread]; 34 NSLog(@"InvocationOperation--%@", thread); 35 } 36 37 38 @end
输出:
2、设置操作的优先级
设置操作对象的优先级,需要调用setQueuePriority:方法。优先级仅使用同一操作队列中的操作。
优先级级别不是依赖关系的替代品,优先级确定操作队列开始执行的顺序,只执行当前准备的操作。例如,如果队列中包含一个高优先级喝一个低优先级的操作,并且两个操作都准备就绪,队列将首先执行高优先级的操作。如果高优先级操作没有准备就绪,而低优先级的操作已经准备好,那么先执行低优先级操作。
优先级只影响操作执行的顺序,而不控制完成的顺序。而且并不是等待高优先级的队列执行完后再执行优先级低的队列。
优先级的值(默认为NSOperationQueuePriorityNormal):
typedef enum : NSInteger {
NSOperationQueuePriorityVeryLow = -8,
NSOperationQueuePriorityLow = -4,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
} NSOperationQueuePriority;
1 NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runOperation) object:nil]; 2 [op1 setQueuePriority:NSOperationQueuePriorityHigh];
3、设置一个完成快
我们可以通过完成块来完成操作完成之后的工作。我们用setCompletionBlock:方法来设置完成块。
1 NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runOperation) object:nil]; 2 3 [op1 setCompletionBlock:^{ 4 //完成一些操作 5 }];