MST

星途 面试题库

面试题:Objective-C中NSOperationQueue的基础应用

请简述NSOperationQueue的作用,并说明如何创建一个NSOperationQueue并向其添加一个NSInvocationOperation。如果需要在操作执行完毕后进行一些处理,应该怎么做?
29.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. NSOperationQueue的作用
    • NSOperationQueue是iOS和OS X开发中用于管理NSOperation对象的队列。它提供了一种方便的方式来异步执行任务。通过将NSOperation对象添加到NSOperationQueue中,队列会根据一定的规则(如优先级等)自动调度这些操作,使其在后台线程中执行,从而避免阻塞主线程,提升应用的响应性和用户体验。同时,NSOperationQueue还支持操作之间的依赖关系设置等功能,方便对复杂任务流程进行管理。
  2. 创建NSOperationQueue并添加NSInvocationOperation
    // 创建一个NSOperationQueue
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 定义一个要执行的方法
    void (^block)(void) = ^{
        NSLog(@"执行操作");
    };
    NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myMethod) object:nil];
    // 将NSInvocationOperation添加到队列中
    [queue addOperation:invocationOperation];
    // 定义要执行的方法
    - (void)myMethod {
        NSLog(@"myMethod执行");
    }
    
  3. 操作执行完毕后进行处理
    • 使用NSOperation的completionBlock
      NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myMethod) object:nil];
      invocationOperation.completionBlock = ^{
          // 操作执行完毕后的处理代码
          NSLog(@"操作执行完毕");
      };
      [queue addOperation:invocationOperation];
      
    • 使用KVO(Key - Value Observing)
      • 首先,为NSOperationisFinished属性添加KVO观察。
      NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myMethod) object:nil];
      [invocationOperation addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionNew context:nil];
      [queue addOperation:invocationOperation];
      
      • 然后在observeValueForKeyPath:ofObject:change:context:方法中进行处理。
      - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
          if ([keyPath isEqualToString:@"isFinished"] && object == self.invocationOperation) {
              // 操作执行完毕后的处理代码
              NSLog(@"操作执行完毕");
              [self.invocationOperation removeObserver:self forKeyPath:@"isFinished"];
          }
      }