面试题答案
一键面试使用NSOperation和NSOperationQueue实现顺序任务调度
- 创建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
- 创建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的主要子类及特点
- 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
子类则可以根据具体需求灵活实现复杂的任务逻辑。