美文网首页
iOS多线程-NSOperation

iOS多线程-NSOperation

作者: 天外丶飞仙 | 来源:发表于2017-08-26 16:02 被阅读29次

    NSOperation其实就是苹果对GCD的封装,把GCD封装成面向对象的编程,让开发者使用起来更加方便,简洁。

    NSOperation的核心

    • NSOperation操作
      • 不能直接使用。
      • 定义子类共有的属性和方法。
      • 子类:
        • NSInvocationOperation(Swift里面没有)
        • NSBlockOperation
    • NSOperationQueue队列
    • 将"操作" 添加到 "队列"类似于GCD将"任务"添加到 "队列"。
      • 队列:本质上 就是GCD的并发队列。
      • 操作:异步执行任务。
      //创建一个NSInvocationOperation
      NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test:) object:@"invocation"];
      //创建队列
      NSOperationQueue * q = [[NSOperationQueue alloc]init];
      //将操作添加到队列 - 会自动异步执行调度方法
      [q addOperation:op];
      
      //创建NSBlockOperation对象
      NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
               NSLog(@"%@ --- %d",[NSThread currentThread],i);
           }];
      //创建队列
      NSOperationQueue * q = [[NSOperationQueue alloc]init];
      //添加到队列
      [q addOperation:op];
      

    线程间的通讯(开发中常用写法)

    [self.opQueue addOperationWithBlock:^{
         NSLog(@"耗时操作  %@",[NSThread currentThread]);
         //主线程更新 UI
         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                NSLog(@ %@",[NSThread currentThread]);
          }];     
     }];
    

    最大并发数

    //这个属性便能控制线程的最大并发数
    self.opQueue.maxConcurrentOperationCount = 2;
    

    队列的暂停和继续

    • suspended: 决定队列的暂停和继续
      //YES暂停NO继续
      self.opQueue.suspended = NO;
      
    • operationCount : 队列中的操作数
      self.opQueue.operationCount 
      

    取消所有操作

    • 队列挂起的时候,不会清空内部的操作.只有在队列继续的时候才会清空。
    • 正在执行的操作也不会被取消。
      [self.opQueue cancelAllOperations];
      

    依赖关系

    例子:

    //1.下载
    NSBlockOperation * op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"下载---%@",[NSThread currentThread]);
            [NSThread sleepForTimeInterval:.5];
    }];
    //2.解压
    NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"解压---%@",[NSThread currentThread]);
            [NSThread sleepForTimeInterval:1.0];
    }];
    //3.通知用户
    NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"通知用户---%@",[NSThread currentThread]);
     }];  
    //NSOperation 提供了依赖关系
    //注意,不要指定循环依赖,队列就不工作了!!
     [op2 addDependency:op1];
     [op3 addDependency:op2];
    //添加到队列中 waitUntilFinished:是否等待! //会卡住当前线程!
    [self.opQueue addOperations:@[op1,op2,op3] waitUntilFinished:NO];
    

    添加好依赖条件操作就会等待依赖的操作执行完再执行。

    相关文章

      网友评论

          本文标题:iOS多线程-NSOperation

          本文链接:https://www.haomeiwen.com/subject/ybumdxtx.html