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
 
 
 
 

posted on 2015-06-03 12:38  listener~  阅读(121)  评论(0)    收藏  举报

导航