NSManagedObject和KVO vs Documentation

Cos*_*que 20 cocoa core-data key-value-observing nsmanagedobject

我有一个自定义NSManagedObject子类,比方说Person.我也UIView注册了-addObserver:forKeyPath:options:context:观察a的各种属性Person,其中一些像"名称"一样持久,而其他属性只是与Core Data无关的KVO兼容的访问器,如"喝酒".

@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
Run Code Online (Sandbox Code Playgroud)

一切正常.每当我发送-getDrunk或设置name属性时,视图都会收到通知.我是一个快乐的人,除非我阅读以下NSManagedObject文件:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
Run Code Online (Sandbox Code Playgroud)

事实1.如果接收器为键值提供键值观察变化通知的自动支持,则为YES,否则为NO.

事实2. NSManagedObject的默认实现为建模属性返回NO,为未建模属性返回YES.

现在我正在努力解析文档中的上述两个事实.检查事实2很简单,类人确实为@"name"返回NO,为@"drink"返回YES.但是,当名称发生变化时,视图如何得到通知?KVO文档清楚地说,

使用自动观察器通知时,没有必要通过调用willChangeValueForKey:和didChangeValueForKey来对属性进行更改:当通过键值编码和符合键值编码的方法改变属性时.

因此,如果Person从+automaticallyNotifiesObserversForKey:@"name" 返回NO ,那么我似乎必须手动将名称设置器包装will/didChangeValueForKey:为KVO才能工作.但是,KVO工作正常.我错过了什么?是什么在点NSManagedObject的覆盖+automaticallyNotifiesObserversForKey:和记录它,如果它似乎没有改变标准的志愿行为?

拜托,帮助我恢复理智.

Ale*_*lex 18

嗯,NSManagedObject确实提供了一个实现name属性(还有- name- setName:方法).我假设Core Data提供的实现包括对willChangeValueForKey:和的调用didChangeValueForKey:.

因此,虽然KVO是"自动的",因为你不需要做任何事情来使它工作,我会想象它在某种意义上并不是自动的,willChangeValueForKey:并且didChangeValueForKey:正在通过方法调用NSManagedObject它来提供动态属性实现.

  • 你的解释是有道理的.非常感谢! (2认同)