我有一个习俗
NSManagedObject
子类,比如说
Person
. 我也有一个
UIView
注册与
-addObserver:forKeyPath:options:context:
观察
人
其中一些是像“name”一样持久的,而另一些则是与核心数据无关的哑kvo兼容的访问器,比如“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
属性,该视图不会收到通知。我是一个快乐的人,除非当我读到
被管理对象
文件说明:
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
事实1。是的,如果接收器自动支持观察密钥更改通知的密钥值,则为否。
事实2。nsmanagedObject的默认实现对于建模的属性返回no,对于未删除的属性返回yes。
现在,我正努力从文档中分析上述两个事实。检查事实2很容易,班上的人确实会为@“name”返回“no”,为@“driving”返回“yes”。但是,当名称更改时,如何通知视图?科沃医生清楚地说,
使用自动观察者通知,当通过键值编码和键值编码兼容方法改变属性时,不需要将更改括在调用willChangeValueForkey:和didChangeValueForkey:的属性中。
所以,如果有人拒绝
+automaticallyNotifiesObserversForKey:
对于@“name”,似乎我必须手动包装name setter
will/didChangeValueForKey:
让kvo工作。但是,kvo有效
只是罚款
. 我错过了什么?有什么意义
被管理对象
压倒一切
+市场自动通知服务器:
如果没有改变标准的kvo行为,记录它?
请帮助我恢复理智。