【问题标题】:How to update an NSManagedObject whenever a specific attribute is changed?每当更改特定属性时,如何更新 NSManagedObject?
【发布时间】:2013-06-28 18:31:19
【问题描述】:

假设我有一个核心数据对象 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 类似,但主要关注运行多个线程,这可能需要更复杂的答案。我正在寻找一些简单的东西,在一个线程上。

【问题讨论】:

  • 但 TechZen 对这个问题的回答(我认为)正是您所需要的:quantity 属性的自定义设置器将同时更新“数量”和“总计”。 (很简单,没有线程:-)
  • @Martin:TechZen 的回答似乎是指 Xcode 3,Xcode 4 中不再提供该复制选项。
  • 但是您仍然可以覆盖托管对象子类的访问器方法。

标签: core-data nsmanagedobject


【解决方案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 生成的文件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2020-02-21
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
相关资源
最近更新 更多