1

想象一下,我有一个核心数据对象 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 类的类别中完成吗?


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

4

1 回答 1

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;
}

如果您不想更改 Xcode 生成的文件,可以将该代码添加到 Product 类的类别中。

于 2013-06-28T19:20:56.667 回答