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

时间:2013-06-28 18:31:20

标签: core-data nsmanagedobject

想象一下,我有一个Core Data对象,Product。每个产品都有quantitypricetotal属性。从表中检索项目时,总计有效率。 (我知道可能有一种有效的方法来使用获取的属性获取计算值,但这只是一个示例,并且该答案不是我要查找的。)

+------+----------+-------+-------+
| Name | Quantity | Price | Total |
+------+----------+-------+-------+
| Foo  |        1 |    20 |    20 |
| Bar  |        0 |    30 |     0 |
| Baz  |        3 |     5 |    15 |
+------+----------+-------+-------+

假设产品的price永远不会改变。但是,quantity确实发生了变化。每当quantity发生变化时,我都会收到通知,以便我可以重新计算total。如果可能的话,我想避免使用KVO,因为我有一个自定义的NSManagedObject类product,我想覆盖其中一个方法以更新价格而不必担心注册/取消注册通知根据自己的属性。

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

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

我应该覆盖哪种方法,可以在我的Product类的类别中完成吗?


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

1 个答案:

答案 0 :(得分:1)

您应该覆盖实体的quantity属性的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生成的文件。