NSOperation 归纳

NSOperation:抽象类,不能直接使用,来进行约束子类具有共同的方法和属性

1.先将要执行的操作封装在NSOperation中

2,然后将这个对象添加到NSOperationQueue中

     系统会自动的将NSOperationQueue的NSOperation取出来

     将取出的的封装操作对象放在一条新线程去执行

NSOperation特有属性:

并发数:同时执行的任务数,比如同时开三个线程执行3个任务,并发数就是3
执行过程:
1.把操作添加到队列中
2.去线程池中取出空闲的线程,没有的话就去创建新的
3.把操作交给从线程池中去出的线程
4执行完成后,把线程池放回线程
5,重复2,3,4.
最大并发数:
 // 设置最大并发数
   _queue.maxConcurrentOperationCount=3;

对列的取消 暂停 恢复

  // 暂停
    self.queue.suspended = YES;

   // 恢复
    self.queue.suspended = NO;
 // 取消
    [self.queue cancelAllOperations];
// 当前操作数
     self.queue.operationCount


// 操作优先级

 NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

        for (int i=0; i<20; i++) {

            NSLog(@"%@   op1",[NSThread currentThread]);

        }

        NSLog(@"end  %@",[NSThread currentThread]);

        

   }];

    // 对op1 进行优先级的设置  这个里面叫做服务质量

    op1.qualityOfService = NSQualityOfServiceUserInteractive;

    // 下面这个方法可以去监听一个操作的进行 当这个操作结束后就会去调用.

    [op1 setCompletionBlock:^{

       

        NSLog(@" 结束了  %@",[NSThread currentThread]);

    }];

 

// 操作依赖  依赖着要先执行完后,才能去执行

 [op2 addDependency:op];

 [op3 addDependency:op2];  // 注意这里不要让这里面的他们进行循环成一个圈... 

 [self.queue  addOperations:@[op,op2,op3] waitUntilFinished:NO];

 

 

 

 

NSInvocationOperation:

 NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(demo) object:nil];

 // 调用star 的方法  更新线程的状态 在主线程上执行  不会开启新的线程
    //[op start];  // 执行的是在主线程上的同步操作..
    
    // 若是想要去进行异步操作  将对象放在队列中
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];// 这样才是异步,开辟了新的线程
    
    [queue addOperation:op];

- (void)demo{
    NSLog(@"%@",[NSThread currentThread]);
}
 NSBlockOperation:
- (void)demo{

    // NSBlockOperation的封装操作数>1的时候,才为异步,开启新线程
    // 这个情况 是在主线程上上运行
    NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
    }];
    [bOp start];
}

// 添加封装操作,执行异步的操作
- (void)demo2{
    
    NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@  1",[NSThread currentThread]);  // 主线程中
    }];
    // 添加一个封装的操作
    [bOp addExecutionBlock:^{
        NSLog(@"%@  2",[NSThread currentThread]);  // 子线程中
    }];
    [bOp start];
}

// 通过队列  完成开启子线程 完成异步操作
- (void)demo3{
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
    }];
    // 通过队列可以完成在开辟子线程,异步操作
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperation:op];
    
}

// 队列直接添加操作  直接开启子线程  完成异步

- (void)demo4{
    // 可以直接这样 完成子线程的开启 异步
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
    }];
}

// 全局队列
NSOperationQueue:

@property (nonatomic,strong)NSOperationQueue *queue;
- (NSOperationQueue *)queue{
    
    if (!_queue) {
        
        _queue = [[NSOperationQueue alloc]init];
    }
    return _queue;
}

 

NSOperation 与GCD异同点: 

1、GCD是一种轻量级的方法来实现多线程。控制起来比较麻烦,比如取消和暂停一个线程。
2、NSOperation和NSOperationQueue相对于GCD效率上要低一点,他们是面向对象的方式,从Mac OS X v10.6和iOS4开始,NSOperation底层也是用的GCD来实现的。可以在多个操作中添加附属,也可以重用操作,取消或者暂停。NSOperation和KVO是兼容,也就是说,可以在NSOperation中使用KVO,例如,你可以通过NSNotificationCenter去让一个操作开始执行。

 

自定义NSOperation: 步棸:

【1】、继承NSOperation类
【2】、重写“main”方法
【3】、在“main”方法中创建一个autoreleasepool
【4】、将自己的代码放在autoreleasepool中
注意:创建自动释放池的原因是,你不能访问主线程的自动释放池,所以需要自己创建一个。

 

posted @ 2016-03-09 15:03  朱保锋  阅读(170)  评论(0编辑  收藏  举报