У меня есть пользовательский подкласс NSManagedObject
, скажем, Person
. У меня также есть UIView
, зарегистрированный в -addObserver:forKeyPath:options:context:
, чтобы наблюдать различные свойства a Person
, некоторые из которых постоянны, как "имя", а другие - просто немые 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 for @ "drink". Но тогда, как представление получает уведомление, когда имя изменяется? В документах KVO четко сказано:
Используя автоматические уведомления наблюдателя, нет необходимости скопировать изменения в свойство с вызовами willChangeValueForKey: и didChangeValueForKey: при мутировании свойств с помощью методов кодирования с ключом и кодирования с ключом.
Итак, если Person возвращает NO из +automaticallyNotifiesObserversForKey:
для @ "name", мне кажется, что мне нужно вручную привязать установщик имен в will/didChangeValueForKey:
для работы KVO. Однако KVO работает отлично. Что мне не хватает? Какая точка в NSManagedObject
переопределяет +automaticallyNotifiesObserversForKey:
и документирует ее, если не изменяет стандартное поведение KVO?
Пожалуйста, помогите мне восстановить мое здравомыслие.