自动更新NSManagedObject属性修改时间戳

时间:2011-12-28 22:28:31

标签: objective-c core-data nsmanagedobject key-value-observing

我有一个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吗?或者那不是那么简单?

3 个答案:

答案 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:,则日期将不会更新。

相关问题