NSOperation介绍
它是一个抽象类,优点是不用关心线程管理,把任务放在要处理的事情上,必须用它的子类,系统默认了两个子类(NSInvocationOperation 和 NSBlockOperation)
用法,创建NSOPeration对象,单独创建一个NSOperation对象基本毫无意义 把它加到线程队列中NSOPerationQueue里执行
但可以试试单独启动一个OPeration对象会如何运行
1.如果在主线程中执行,NSInvocationOperation那么在主线程中顺序执行
1 // 单独创建operation会在当前线程中同步串行执行 Main 线程 2 NSInvocationOperation *task1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task1:) object:@(1)]; 3 task1.name = @"task1 operation"; 4 [task1 start]; 5 NSLog(@"task1 ------------------------------"); 6 NSInvocationOperation *task2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task2:) object:@(1)]; 7 task2.name = @"task2 operation"; 8 [task2 start]; 9 NSLog(@"task2 ------------------------------"); 10 NSBlockOperation *task3 = [NSBlockOperation blockOperationWithBlock:^{ 11 [self task:@"task3 operation"]; 12 }]; 13 [task3 start]; 14 NSLog(@"task3 ------------------------------");
2.如果用NSBlockOperation 创建两个任务,会在主线程中执行并且两个同时执行
NSBlockOperation *blockTask = [[NSBlockOperation alloc] init]; [blockTask addExecutionBlock:^{ [self task:@"block task 1"]; }]; [blockTask addExecutionBlock:^{ [self task:@"block task 2"]; }];
3.NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main就
@implementation CXDownloadOperation - (void)main{ @autoreleasepool { if (self.isCancelled)return; NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSData dataWithContentsOfURL:url]; if (self.isCancelled) return; UIImage *image = [UIImage imageWithData:data]; if(self.isCancelled) return; if (self.downloadFinishedBlock) { self.downloadFinishedBlock(image,self.urlString); } } }
4.NSOperationQueue控制各个operation的并发执行.它像是一个优先级队列,operation大致的会按FIFO的方式被执行,带有高优先级的会跳到低优先级前面被执行(用NSOperation的queuePriority方法来设置优先级)。 NSOperationQueue支持并发的执行operations,通过maxConcurrentOperationCount来指定最大并发数, 就是同时有最多有多少个operation同时被运行。虽然设置优先级,但执行过程中还是并行执行,具体哪个任务先执行完,看任务大小.
如果最大并行执行是maxConcurrentOperationCount = 1 ,则队列任务异步串行执行,优先级高的先执行
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ [self task:@"op1优先级高 操作1"]; }]; [op1 addExecutionBlock:^{ [self task:@"op1优先级高 操作2"]; }]; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ [self task:@"优先级低"]; }]; op1.queuePriority = NSOperationQueuePriorityVeryHigh; op2.queuePriority = NSOperationQueuePriorityLow; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:op1]; [queue addOperation:op2];
5.给NSOPeration 添加依赖 一个任务需要依靠另外一个任务完成才能执行
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ [self task:@"op1"]; }]; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ [self task:@"op2"]; }]; NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ [self task:@"op3"]; }]; [op2 addDependency:op1];// 添加依赖关系 op1执行完后再执行op2 [op3 addDependency:op2];// 注意不能相互依赖 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3];
http://www.cnblogs.com/yingkong1987/p/3221479.html
http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues
浙公网安备 33010602011771号