NSOperation | 青训营笔记

76 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

1、简介

  • NSOperation是一个抽象类
    • 不能直接使用(方法没有实现)
    • 约束子类都具有共同的属性和方法
  • NSOperation的子类
    • NSInvocationOperation
    • NSBlockOperation
    • 自定义operation
  • NSOperationQueue队列
  • 步骤
    • 先将需要执行的操作封装到一个NSOperation对象中
    • 然后将NSOperation对象添加到NSOperationQueue队列中
      1. 系统会自动将NSOperationQueue中的NSOperation取出来
      2. 将取出的NSOperation封装的操作放到一条新线程中执行

image.png

2、NSInvocationOperation

  • 不开启新线程
//创建操作
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
//直接执行操作 不开启新线程
[op start];//不开启新线程
  • 开启新线程
//创建操作
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//把操作添加到队列 开启子线程
[queue addOperation:op];

3、NSBlockOperation

//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//创建操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    NSLog("");
}];
//将操作添加到队列中
[queue addOperation:op];

4、线程间通信

//创建操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    NSLog("异步下载图片"); //子线程
    
    //获取当前的队列
    [NSOperationQueue currentQueue];
    
    //回到主线程更新UI
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        NSLog("更新UI");
    }]; 
}];

5、最大并发数

  • 最大并发数并不是线程数,而是指队列中同一时间同时能执行几个操作
  • 最大并发数是队列中的属性
_queue.maxConcurrentOperationCount = 2; //该队列同时执行最多两个操作,但是线程开启数可能会更多

6、队列的暂停、取消、恢复

  • 取消队列所有操作是一个方法

- (void)cancelAllOperations;

  • 暂停和恢复队列 是队列中的属性
  • - (void)setSuspended:(BOOL)b; //YES代表暂停队列,NO代表恢复队列
  • (BOOL)isSuspended;
      //取消所有操作
      [self.queue cancelAllOperations];
      //暂停操作
      self.queue.suspended = YES;
      //继续操作
      self.queue.suspended = NO;
      ```
    

7、操作的优先级(服务质量)

  • 队列中有多个操作,操作的优先级越高在队列中被调用的几率越高
    op1.qualityOgService = NSQualityOfServiceUserInteractive;

8、操作依赖

  • NSOperation之间可以设置依赖来保证执行顺序
  • 让操作A执行完了之后,才能执行操作B
[operationB addDependency:operationA];//操作B依赖操作A
  • 可以在不同的队列中的NSOperation中创建依赖关系

image.png

9、NSOperation和GCD的区别

  • GCD
    • 一次性执行
    • 延迟执行
    • 调度组
  • NSOperation
    • 最大并发数
    • 队列的暂停/继续
    • 取消所有操作
    • 取消操作直接的依赖关系