当NSOperation子类化完成一小部分工作时,我发现它很容易陷入僵局。下面我有一个玩具的例子,很容易理解为什么它永远不会完成。异步可可 - 在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;
}