想象一下,我有一个Core Data对象,Product。每个产品都有quantity
,price
和total
属性。从表中检索项目时,总计有效率。 (我知道可能有一种有效的方法来使用获取的属性获取计算值,但这只是一个示例,并且该答案不是我要查找的。)
+------+----------+-------+-------+
| 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类似,但主要涉及运行多个线程,这可能需要更复杂的答案。我在一个线程上寻找简单的东西。
答案 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生成的文件。