zoukankan      html  css  js  c++  java
  • 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中
    注意:创建自动释放池的原因是,你不能访问主线程的自动释放池,所以需要自己创建一个。

  • 相关阅读:
    关于CoreData的使用
    【转】向iOS开发者介绍C++(-)
    Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
    【转】Object-C 多线程中锁的使用-NSLock
    写了半天的返回
    oracle 锁表问题
    LINQ的基本认识
    Oracle客户端配置
    REVERSE
    vchar2和nvchar2
  • 原文地址:https://www.cnblogs.com/zhubaofeng/p/5258238.html
Copyright © 2011-2022 走看看