OC - 14.NSOperation与NSOperationQueue

简介


  • 通过NSOperation与NSOperationQueue的组合也能实现多线程
  • 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现

NSOperation


  • NSOperation是一个抽象类,不能用来直接封装操作,通常使用它的子类来封装操作
  • 若不将NSOperation对象添加到NSOperationQueue中,操作只会在当前线程执行,且需要手动开始执行操作
  • NSoperation的子类
    • NSInvocationOperation

      //创建操作
      NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
      //开始执行操作
      [operation start];
    • NSBlockOperation(当操作数大于1时,异步执行)
      //创建操作
      NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
          //操作封装的任务代码
      }];
      //添加操作
      [operation addExecutionBlock:^{
          //操作封装的任务代码
      }];
      //开始执行操作
      [operation start];
    • 自定义子类的步骤
      • 重写- (void)main方法,在该方法中封装需要执行的操作
      • 在- (void)main方法中,需要自己建立自动释放池(原因:若是异步操作,无法访问主线程的自动释放池)
      • 通过检查cancelled等属性,来判断操作的状态,执行相应的操作
  • 设置操作完成时的回调
    //创建操作
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
       //任务代码
    }];
    //设置回调
    operation.completionBlock = ^{
        //操作完成时执行的代码
    };

NSOperationQueue


  • 作用

    • 容纳需要异步执行的操作
    • 系统会自动执行NSOperationQueue中的操作,不需要手动启动
  • NSOperationQueue的相关操作
    • 创建操作队列

      • [[NSOperationQueue alloc] init]
    • 获取主操作队列
      • + (NSOperationQueue *)mainQueue
    • 获取当前操作队列
      • + (nullable NSOperationQueue *)currentQueue
    • 往队列中添加操作
      • - (void)addOperation:(NSOperation *)op
      • - (void)addOperationWithBlock:(void (^)(void))block
    • 设置最大并发操作数
      • - setMaxConcurrentOperationCount:(NSInteger)count
      • 若并发操作数为1,则为串行队列
    • 暂停/启动队列中的任务
      • - setSuspended:(BOOL)b
    • 取消队列中的任务
      • - (void)cancelAllOperations
      • 等到正在执行的任务执行完毕,队列才会被挂起

实现多线程的步骤


  • 创建操作队列

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]
  • 往队列中添加操作
    /**
    方法一
    */
    //创建操作
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download为操作封装的任务方法
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        //任务代码
    }];
    //添加操作
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    
    /**
    方法二
    */
    //添加操作
    [queue addOperationWithBlock:^{
        //操作封装的任务
    }];

操作依赖


  • 作用

    • 建立操作之间的执行顺序关系
    • 操作依赖是面向操作的,可以跨队列建立操作之间的依赖关系
    • 若要建立操作之间的依赖关系,必须在操作被添加到队列之前建立
  • 建立操作依赖的步骤
    • 创建操作队列

      NSOperationQueue *queue = [[NSOperationQueue alloc] init]
    • 添加操作
      NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
          //任务1代码
      }];
      NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
          //任务2代码
      }];
    • 建立依赖关系(必须在操作被添加到队列之前)
      [operation1 addDependency:operation2];
    • 将操作添加到队列
      [queue addOperation:operation1];
      [queue addOperation:operation2];

线程之间的通信


  • 从主线程到子线程

    • 从主线程到子线程的切换,通常是系统自动完成的,只需要将操作添加到队列中,系统就会根据实际需要,是否切换到子线程中执行操作
  • 从子线程到主线程
    • 将需要执行的操作,添加到主操作队列中即可(该操作将运行在主runLoop的common模式下)

      [[NSOperationQueue mainQueue] addOperationWithBlock:^{
              //需要在主线程中执行的任务代码
          }];
时间: 2024-08-25 21:08:55

OC - 14.NSOperation与NSOperationQueue的相关文章

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

多线程之NSOperation和NSOperationQueue

这篇文章里我将不过多的谈及理论知识,这些东西会的自然会,不会的,看多了也是云里雾里.下面我讲更多的用代码+注释的方式来讲如何使用NSOperation和NSOperationQueue. 1.NSOperation.是抽象类,不能够直接使用,而是使用子类NSInvocationOperation和NSBlockOperation来实际执行任务.NSOperation本身和多线程是没有任何关系的,她只是封装了一个代码段和数据去实现一个功能. 1.1.NSInvocationOperation,基于

使用NSOperation和NSOperationQueue实现多线程编程

使用NSOperation和NSOperationQueue实现多线程编程,实现步骤大致是这样的: 1> 先将需要执行的操作封装到一个NSOperation对象中 2> 然后将NSOperation对象添加到NSOperationQueue中 3> 系统会自动将NSOperation中封装的操作放到一条新线程中执行 回到顶部 一.NSInvocationOperation 1 NSInvocationOperation *operation = [[[NSInvocationOperat

Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueue) (3)Grand Central Dispath(GCD) 2,本文着重介绍Cocoa NSOperation Cocoa NSOperation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上.相关的类有NSOperation和 NSOperationQueue.其中N

用NSOperation和NSOperationQueue实现多线程编程

1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation和NSOperationQueue实现多线程编程,实现步骤大致是这样的: 1> 先将需要执行的操作封装到一个NSOperation对象中 2> 然后将NSOperation对象添加到NSOperationQueue中 3> 系统会自动将NSOperation中封装的操作放到一条新线程中执行 在此过

NSOperation、NSOperationQueue(II)

NSOperationQueue 控制串行执行.并发执行 NSOperationQueue 创建的自定义队列同时具有串行.并发功能 这里有个关键属性 maxConcurrentOperationCount,叫做最大并发操作数.用来控制一个特定队列中可以有多少个操作同时参与并发执行. 最大并发操作数:maxConcurrentOperationCount maxConcurrentOperationCount 默认情况下为-1,表示不进行限制,可进行并发执行. maxConcurrentOpera

ios多线程之NSOperation和NSOperationQueue

NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1.NSOperation和NSOperationQueue实现多线程的具体步骤 2.先将需要执行的操作封装到一个NSOperation对象中 3.然后将NSOperation对象添加到NSOperationQueue中 4.系统会自动将NSOperationQueue中的NSOperation取出来 5.将取出的NSOperation封装的操作放到一条新线程中执行 NSOperat

iOS多线程编程之NSOperation和NSOperationQueue的使用(转自容芳志专栏)

转自由http://blog.csdn.net/totogo2010/ 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main.相当与ja

使用NSOperation以及NSOperationQueue

NSOperation vs. Grand Central Dispatch (GCD) 在Mac OS X v10.6和iOS4之前,NSOperation 与 NSOperationQueue 不同于GCD,他们使用了完全不同的机制. 从Mac OS X v10.6和iOS4开始,NSOperation 和 NSOperationQueue是建立在GCD上的.作为一种通例,苹果推荐使用最高级别的抽象,然而当评估显示有需要时,会突然降到更低级别. 以下是对两者的快速比较,它会帮助你决定何时何地