При создании подкласса 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;
}