核心数据缓存NSSet属性

时间:2013-04-19 13:35:30

标签: core-data key-value-observing

不确定我的标题最能描述我的问题,但却想不出更好的问题!

我有2个托管对象,'交易'和'拆分'。 Transaction与'Split'有1对多的关系,因此有一个分裂对象的NSSet。 Split有2个属性,Category(NSString)和Amount(NSDecimalNumber)。

一个Transaction有一个值,我现在通过迭代Split对象的NSSet来累加所有'Amount'属性来计算。

这个工作正常,我似乎没有任何性能问题,但我怀疑当你有1000个交易时,它不会很好地扩展。

我认为我需要做的是,在Transaction对象上有一个'Amount'属性(作为一个cahce)并且每次都更新它并且更改它包含的一个'Split'对象的'Amount'属性在其NSSet内。

希望到目前为止我有意义..

我的问题是实现这一目标的最佳方式?感觉就像KVO设计的那样,但我之前并没有真正使用它。我的Transaction对象是否需要在其某个Splits的'Amount'值发生变化时得到通知,因此可以重新计算自己的值?

或者应该在Split ??

中的Amount属性的setter中完成

当然这是一个常见的问题,并且存在一个非常优雅的解决方案?任何建议和示例代码非常赞赏..?

干杯

1 个答案:

答案 0 :(得分:0)

我会覆盖amount Split的{​​{1}}制定者 这样,如果你有一天需要优化或扩展,你可以改变一对多的关系,改为没有逆的关系,完全保存集的创建(删除逆的情况下删除强制执行)会更复杂。)

代码看起来像:

//not tested
- (void) setAmount:(NSUInteger)amount
{
    [self willChangeValueForKey:@"amount"];
    [self setPrimitiveValue:@(amount) forKey:@"amount"];
    self.transaction.amount += amount;
    [self didChangeValueForKey:@"amount"];
}

编辑(@Tommy):

删除后,您需要减去Split amout:

- (void) prepareForDeletion
{
    self.transaction.amount -= self.amount;
}

另外,在设置上下文合并策略时要非常小心,因此对来自不同上下文的事务的更改不会相互覆盖(使用默认的错误策略)。