当子类化 NSOperation 以完成一小部分工作时,我发现它很容易陷入僵局。下面我有一个玩具示例,很容易理解为什么它永远不会完成。
我似乎只能从调用者的角度考虑防止死锁的解决方案,而不是被调用者。例如,调用者可以继续运行运行循环,而不是等待完成等。如果主线程在操作过程中需要同步消息,我想知道是否有一个操作子类可以实现的规范解决方案防止这种类型的死锁。我才刚刚开始涉足异步编程......
@interface ToyOperation : NSOperation
@end
@implementation ToyOperation
- (void)main
{
// Lots of work
NSString *string = @"Important Message";
[self performSelector:@selector(sendMainThreadSensitiveMessage:) onThread:[NSThread mainThread] withObject:string waitUntilDone:YES];
// Lots more work
}
- (void)sendMainThreadSensitiveMessage:(NSString *)string
{
// Update the UI or something that requires the main thread...
}
@end
- (int)main
{
ToyOperation *op = [[ToyOperation alloc] init];
NSOperationQueue *opQ = [[NSOperationQueue alloc] init];
[opQ addOperations: @[ op ] waitUntilFinished:YES]; // Deadlock
return;
}