Core data 如何在特定属性更改时更新NSManagedObject?

Core data 如何在特定属性更改时更新NSManagedObject?,core-data,nsmanagedobject,Core Data,Nsmanagedobject,假设我有一个核心数据对象,产品。每个产品都有一个数量、价格和总计属性。在从表中检索项目时,Total用于提高效率。(我知道可能有一种有效的方法可以使用获取的属性获取计算值,但这只是一个示例,而这个答案不是我想要的。) 假设产品的价格从未改变。但是,数量会发生变化。无论何时数量发生变化,我都希望得到通知,以便重新计算总量。如果可能的话,我希望避免使用KVO,因为我有一个定制的NSManagedObject类,product,我希望覆盖它的一个方法来更新价格,而不必担心注册/取消注册自己属性上的通知

假设我有一个核心数据对象,产品。每个产品都有一个
数量
价格
总计
属性。在从表中检索项目时,Total用于提高效率。(我知道可能有一种有效的方法可以使用获取的属性获取计算值,但这只是一个示例,而这个答案不是我想要的。)

假设产品的
价格
从未改变。但是,
数量
会发生变化。无论何时
数量
发生变化,我都希望得到通知,以便重新计算
总量
。如果可能的话,我希望避免使用KVO,因为我有一个定制的NSManagedObject类,
product
,我希望覆盖它的一个方法来更新价格,而不必担心注册/取消注册自己属性上的通知

此方法只应在价格更改时调用,而不是每次对象上的任何属性更改时调用

我还希望在值更改时立即触发此方法(例如,不在保存上下文之前),以便在保存上下文之前访问新的
total
属性

我应该重写哪种方法?它可以在我的产品类的类别中完成吗



注意:类似,但主要涉及运行多个线程,这可能需要更复杂的答案。我在单线程上寻找一些简单的东西。

您应该覆盖实体的
数量属性的setter方法:

- (void)setQuantity:(NSNumber *)quantity
{
    [self willChangeValueForKey:@"quantity"];
    [self setPrimitiveValue:quantity forKey:@"quantity"];
    [self didChangeValueForKey:@"quantity"];

    NSNumber *price = ... // compute new price
    self.price = price;
}
如果不想更改,可以将该代码添加到Product类的类别中
Xcode生成的文件。

您应该覆盖实体的
数量属性的setter方法:

- (void)setQuantity:(NSNumber *)quantity
{
    [self willChangeValueForKey:@"quantity"];
    [self setPrimitiveValue:quantity forKey:@"quantity"];
    [self didChangeValueForKey:@"quantity"];

    NSNumber *price = ... // compute new price
    self.price = price;
}
如果不想更改,可以将该代码添加到Product类的类别中
Xcode生成了文件。

但是TechZen对这个问题的回答(正如我所想)正是您所需要的:为
quantity
属性定制一个setter,它将同时更新“quantity”和“total”。(非常简单,没有线程:-)@Martin:TechZen的答案似乎是指Xcode 3,该复制选项在Xcode 4中不再可用。但您仍然可以覆盖托管对象子类的访问器方法。但TechZen对该问题的答案是(正如我所想)正是您所需要的:一个
quantity
属性的自定义setter,它将同时更新“quantity”和“total”。(非常简单,没有线程:-)@Martin:TechZen的答案似乎是指Xcode 3,该复制选项在Xcode 4中不再可用。但您仍然可以覆盖托管对象子类的访问器方法。要知道要使用哪个锅炉板代码,请参阅。要知道要使用哪个锅炉板代码,请参阅。