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