我有一个自定义的NSManagedObject
子类,比如说,Person
。 我还有一个UIView
通过-addObserver:forKeyPath:options:context:
注册来观察Person
的各种属性,其中一些是持久化的,例如“name”,而其他一些则只是KVO兼容的访问器,与Core Data无关,例如“drinking”。
@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
Fact 1:如果接收器为键提供自动支持的观察者变更通知,则返回YES,否则返回NO。Fact 2:NSManagedObject的默认实现对于建模属性返回NO,对于非建模属性返回YES。
现在我正在努力从文档中解析上述两个事实。检查Fact 2很容易,类Person确实对@"name"返回NO,并对@"drinking"返回YES。但是,当名称更改时,视图如何得到通知?KVO文档明确说明:
通过使用自动观察者通知,在使用键值编码和键值编码兼容方法修改属性时,不需要使用willChangeValueForKey:和didChangeValueForKey:来限定属性的更改。
因此,如果Person从+"automaticallyNotifiesObserversForKey:"中对@"name"返回NO,似乎我必须手动将名称设置包装在will/didChangeValueForKey:中,以使KVO正常工作。然而,KVO却工作得很好。我漏掉了什么?如果不改变标准的KVO行为,那么 NSManagedObject的覆盖+automaticallyNotifiesObserversForKey:并记录它的意义是什么?
请帮我恢复理智。