面试题答案
一键面试- NSOperationQueue的作用:
NSOperationQueue
是iOS和OS X开发中用于管理NSOperation
对象的队列。它提供了一种方便的方式来异步执行任务。通过将NSOperation
对象添加到NSOperationQueue
中,队列会根据一定的规则(如优先级等)自动调度这些操作,使其在后台线程中执行,从而避免阻塞主线程,提升应用的响应性和用户体验。同时,NSOperationQueue
还支持操作之间的依赖关系设置等功能,方便对复杂任务流程进行管理。
- 创建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执行"); }
- 操作执行完毕后进行处理:
- 使用NSOperation的completionBlock:
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myMethod) object:nil]; invocationOperation.completionBlock = ^{ // 操作执行完毕后的处理代码 NSLog(@"操作执行完毕"); }; [queue addOperation:invocationOperation];
- 使用KVO(Key - Value Observing):
- 首先,为
NSOperation
的isFinished
属性添加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"]; } }
- 首先,为
- 使用NSOperation的completionBlock: