Подтвердить что ты не робот

NSManagedObject и KVO против Документации

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

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

4b9b3361

Ответ 1

Ну, NSManagedObject предоставляет реализацию для свойства name (а также методы - name и - setName:). Я бы предположил, что реализации, предоставленные Core Data, включают вызовы willChangeValueForKey: и didChangeValueForKey:.

Итак, хотя KVO является "автоматическим" в том смысле, что вам не нужно ничего делать, чтобы заставить его работать, я бы предположил, что он не является автоматическим в том смысле, что willChangeValueForKey: и didChangeValueForKey: вызванных методами в NSManagedObject, которые предоставляют реализации динамических свойств.