NSManagedObject и KVO vs Documentation

У меня есть собственный подкласс 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 не меняется?

Пожалуйста, помогите мне восстановить рассудок.

20
задан Costique 15 February 2012 в 19:47
поделиться