NSManagedObject и KVO против документации - PullRequest
20 голосов
/ 16 сентября 2010

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

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

1 Ответ

18 голосов
/ 16 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...