MST
星途 面试题库

面试题:Objective-C中NSOperation与NSOperationQueue如何实现简单任务调度

请简述在Objective-C中,如何使用NSOperation和NSOperationQueue实现一个简单的任务调度,比如有三个不同的打印任务,按顺序依次执行。并且说明NSOperation的主要子类有哪些,它们的特点是什么。
38.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

使用NSOperation和NSOperationQueue实现顺序任务调度

  1. 创建NSOperation子类
    • 首先创建一个继承自NSOperation的子类,重写main方法,在main方法中实现具体的打印任务。例如:
@interface PrintOperation : NSOperation
@property (nonatomic, strong) NSString *message;
- (instancetype)initWithMessage:(NSString *)message;
@end

@implementation PrintOperation
- (instancetype)initWithMessage:(NSString *)message {
    self = [super init];
    if (self) {
        _message = message;
    }
    return self;
}
- (void)main {
    if (self.isCancelled) return;
    NSLog(@"%@", self.message);
}
@end
  1. 创建NSOperationQueue并添加任务
    • 在需要执行任务的地方,创建NSOperationQueue实例,然后创建三个PrintOperation实例,并依次添加到队列中。由于队列默认是按照添加顺序执行任务,所以可以实现顺序执行。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
PrintOperation *op1 = [[PrintOperation alloc] initWithMessage:@"任务1"];
PrintOperation *op2 = [[PrintOperation alloc] initWithMessage:@"任务2"];
PrintOperation *op3 = [[PrintOperation alloc] initWithMessage:@"任务3"];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];

NSOperation的主要子类及特点

  1. NSInvocationOperation
    • 特点:通过NSInvocation来包装一个方法调用。它可以将一个已有的方法包装成一个操作任务。创建时需要传入一个目标对象和一个选择器,以及选择器所需的参数。例如:
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myMethod:) object:@"参数"];
- **局限性**:灵活性相对较差,只能包装一个方法调用,且方法的参数和返回值都受限于`NSInvocation`的要求。

2. NSBlockOperation: - 特点:可以添加多个block到操作中,这些block会在操作执行时依次执行。它允许在一个操作中执行多个相关的代码块。例如:

NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"第一个block");
}];
[blockOp addExecutionBlock:^{
    NSLog(@"第二个block");
}];
- **优点**:使用block来定义任务,简洁方便,适用于一些轻量级的任务组合。

总的来说,NSInvocationOperation适合包装已有的方法,NSBlockOperation适合使用block来定义任务,而自定义的NSOperation子类则可以根据具体需求灵活实现复杂的任务逻辑。