У меня есть собственный подкласс NSManagedObject
, скажем, Человек
. У меня также есть UIView
, зарегистрированный с помощью -addObserver: forKeyPath: options: context:
для наблюдения за различными свойствами Person
, некоторые из них являются постоянными, как «name», а другие - просто тупыми KVO-совместимыми аксессуарами, не связанными с Core Data, например, «drink».
@interface Person : NSManagedObject
{
BOOL drinking;
}
@property (nonatomic, retain) NSString* name;
@property (nonatomic, readonly) BOOL drinking;
@end
@implementation Person
@dynamic name;
...
- (void) getDrunk {
[self willChangeValueForKey: @"drinking"];
drinking = YES;
[self didChangeValueForKey: @"drinking"];
}
...
@end
Все работает. Каждый раз, когда я отправляю -getDrunk
или устанавливаю свойство name
, представление получает уведомление. Я счастлив, за исключением тех случаев, когда я прочитал NSManagedObject
документы, в которых говорится:
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
Факт 1. ДА, если получатель обеспечивает автоматическую поддержку уведомлений об изменении значения ключа, в противном случае НЕТ. Факт 2. Реализация по умолчанию для NSManagedObject возвращает NO для смоделированных свойств и YES для немоделированных свойств.
Теперь я изо всех сил пытаюсь проанализировать два приведенных выше факта из документации. Проверить факт 2 несложно, и класс Person действительно возвращает NO для @ "name" и YES для @ "drink". Но потом, как представление получает уведомление при изменении имени? В документах KVO четко сказано:
Используя автоматические уведомления наблюдателя, нет необходимости заключать в скобки изменения свойства с вызовами willChangeValueForKey: и didChangeValueForKey: при изменении свойств с помощью методов, совместимых с кодированием значения ключа и кодированием значения ключа.
Итак, если Person возвращает NO из + automaticNotifiesObserversForKey:
для @ "name", может показаться, что мне придется вручную обернуть установщик имени в will / didChangeValueForKey:
для работы KVO. Однако KVO работает нормально . Что мне не хватает? Какой смысл в том, чтобы NSManagedObject
переопределял + automaticNotifiesObserversForKey:
и документировал это, если кажется, что стандартное поведение KVO не меняется?
Пожалуйста, помогите мне восстановить рассудок.