Я работаю над подклассом NSOperation и столкнулся с этой очень странной проблемой, когда блок завершения вызывается дважды подряд. Вызовы KVO выглядят нормально, но завершение блока по-прежнему странно вызывается дважды. Я неправильно понимаю NSOperation? В документации сказано, что блок завершения вызывается, когда isFinished
становится YES
, и в моем коде это происходит только один раз:
- (void)main {
@autoreleasepool {
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isReady"];
executing = YES;
[self didChangeValueForKey:@"isReady"];
[self didChangeValueForKey:@"isExecuting"];
//start the operation
}
}
Затем я просто установил completionBlock
следующим образом:
self.completionBlock = ^{
NSLog(@"Completed");
}
Когда он заканчивается, этот метод вызывается (он вызывается только ОДИН РАЗ, я дважды проверил это)
- (void)completeOperation {
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
executing = NO;
completed = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
Но завершениеBlock вызывается дважды и дважды выводит «Completed» в консоль.
А вот и методы, указывающие на текущее состояние:
- (BOOL)isReady {
if (executing || cancelled || completed) {
return NO;
}
return YES;
}
- (BOOL)isCancelled {
return cancelled;
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return executing;
}
- (BOOL)isFinished {
return completed;
}
isCancelled
никогда не превращается в YES
в моем тестовом коде, так что это не может быть причиной.
Я действительно не понимаю, почему завершение блока вызывается дважды. Даже при установке блока завершения на nil внутри блока завершения он иногда вызывается дважды, что еще более странно.