我有一个NSManagedObject
,有两个属性:
NSNumber *score;
NSDate *score_timestamp;
我希望每次更新score_timestamp
时都会更新score
字段。
我显然无法使用-willSave
方法,因为偶尔会保存我的上下文,score_timestamp
将不会是最新的。因此,我应该覆盖-setScore:
或将我的托管对象设置为其自己的score
字段的键值观察器。
-setScore:
解决方案似乎很简单:
- (void) setScore:(NSNumber *)score
{
[self willChangeValueForKey:@"score"];
[self setPrimitiveScore:score];
[self didChangeValueForKey:@"score"];
self.score_timestamp = [NSDate date];
}
这样做有什么警告吗?或者我应该使用KVO解决方案?
更新
到目前为止,我收到了两个回复,我的代码无法通过setValue: forKey:
处理,我还在等待示例。天真的呼唤[(NSManagedObject *)myObject setValue:value forKey:@"score"]
会一直呼唤我的二传手。
因此,如果我切换到KVO解决方案,我应该在所有addObserver:
方法中awake
并将其移除willTurnIntoFault
吗?或者那不是那么简单?
答案 0 :(得分:4)
你问题中的实施很好。任何KVC尝试更新您的值也会通过setter方法(setValue: forKey:
只搜索匹配setKey
的访问者方法,有关详细信息,请参阅here。
答案 1 :(得分:1)
您正在寻找Key-Value Observing
[objectWithArray addObserver:self
forKeyPath:@"score"
options:NSKeyValueObservingOptionNew
context:nil];
然后观察它:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
//Check if [change objectForKey:NSKeyValueChangeNewKey] is equal to "score"
//and update the score_timestamp appropriately
}
你应该在你从提取中醒来时注册通知,并在你出错时取消注册,我相信。
答案 2 :(得分:0)
在此方法中,如果出于任何原因,您将对象修改为不是自定义子类,而是使用NSManagedObject
作为setValue: forKey:
,则日期将不会更新。