При работе с пользовательским подклассом NSOperation
я заметил, что автоматическое наблюдение за значением ключа отключено методом класса [NSOperation automaticallyNotifiesObserversForKey]
(который возвращает NO
по крайней мере для некоторых ключевых путей). Из-за этого код внутри подклассов NSOperation
замусорен ручными вызовами willChangeValueForKey:
и didChange…
, что видно во многих примерах кода в Интернете.
Почему NSOperation
это делает? С автоматической поддержкой KVO люди могут просто объявлять свойства для флагов жизненного цикла операции (isExecuting
и т. д.) и запускать события KVO через средства доступа, т.е. следующий код:
[self willChangeValueForKey:@"isExecuting"];
executing = NO;
[self didChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
finished = YES;
[self didChangeValueForKey:@"isFinished"];
…можно заменить на это:
[self setIsExecuting:NO];
[self setIsFinished:YES];
Где-то есть подвох? Я просто изменил automaticallyNotifiesObserversForKey
, чтобы вернуть YES
, и все работает нормально.