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它来提供动态属性实现.
| 归档时间: |
|
| 查看次数: |
4818 次 |
| 最近记录: |