美文网首页
多线程(NSOperation)

多线程(NSOperation)

作者: JS_swh | 来源:发表于2017-03-20 18:06 被阅读0次

    基本使用

    • NSInvocationOperation
      NSInvocationOperation op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];
      // 创建队列
      /

      GCD:
      串行类型: create & 主队列
      并发类型: create & 全局并发队列
      NSOperation:
      主队列(串行队列): [NSOperationQueue MainQueue] 和 GCD主队列一样
      非主队列: [[NSOperationQueue alloc] init] 非常特殊(同时具备并发和串行的功能) (默认情况下是并发队列)
      */
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      // 将操作添加到队列中
      [queue addOperation:op]; // 内部已经调用了start方法

    • NSBlockOperation
      NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
      }];
      // 追加任务 (一个操作对象包含一个以上任务 可能会开启子线程并发执行任务)
      [op addExecutionBlock:^{
      }];
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      [queue addOperation:op];

        // 简便方法
        [queue addOperationWithBlock:^{
        
        }];
      
    • 自定义NSOperation
      // 自定义操作类继承自NSOperation 重写main方法
      #import "SWOperation.h"
      @implementation SWOperation
      // 要执行的任务
      -(void)main
      {
      }
      @end

      // 调用该自定义操作类 即可实现并发操作 
      SWOperation *op = [[SWOperation alloc] init];
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      [queue addOperation:op];
      

    NSOperation其他用法(暂停/恢复/取消/最大并发数)

    • 最大并发数(默认值为-1,表示最大值)
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      // 最大并发数(同一时间最多有多少个任务可以执行) 并发数为1时为串行执行(注:串行不代表只开一条线程)
      queue.maxConcurrentOperationCount = 1;

    • 暂停/恢复/取消
      // 暂停 (不能暂停当前正在执行的任务 暂停后队列中未执行的任务会停止执行)
      queue.suspended = YES;
      // 恢复
      queue.suspended = NO;
      // 取消
      [queue cancelAllOperations];

      // 自定义类的暂停/恢复/取消
      #import "SWOperation.h"
      @implementation SWOperation
      // 要执行的任务
      -(void)main
      {
         for (int i = 0; i < 1000; i++) {
              NSLog(@"download1---%d---%@",i,[NSThread mainThread]);
         }
         // 点击取消 会自动调用cancel方法 判断是否取消 若取消 则退出
         if (self.isCancelled) {
             return;
         }
         for (int i = 0; i < 1000; i++) {
             NSLog(@"download1---%d---%@",i,[NSThread mainThread]);
         }
      }
      @end
      
    • 操作依赖
      // 操作1依赖于操作2 (不能循环依赖)
      // 可以跨队列依赖
      [op1 addDependency:op2];

    • 操作监听
      // 操作监听
      [op1 setCompletionBlock:^{
      // op1操作执行完毕
      }];

    NSOperation线程间通讯

    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        // 执行耗时操作
        // 回主线程更新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            // 更新UI
        }];
    }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:op];
    

    相关文章

      网友评论

          本文标题:多线程(NSOperation)

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