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