Core data 核心数据缓存NSSet属性

Core data 核心数据缓存NSSet属性,core-data,key-value-observing,Core Data,Key Value Observing,我不确定我的题目最能描述我的问题,但想不出更好的题目了 我有两个托管对象,“事务”和“拆分”。事务与“拆分”具有1对多关系,因此具有一组拆分对象。拆分有两个属性:类别(NSString)和金额(NSDecimalNumber) 一个事务有一个值,我当前通过迭代分割对象的NSSet来计算该值,并将所有“Amount”属性相加 这工作正常,我似乎没有任何性能问题,但我怀疑当您有1000个事务时,这不会很好地扩展 我认为我需要做的是,在事务对象(作为cahce)上有一个“Amount”属性,并在每次对

我不确定我的题目最能描述我的问题,但想不出更好的题目了

我有两个托管对象,“事务”和“拆分”。事务与“拆分”具有1对多关系,因此具有一组拆分对象。拆分有两个属性:类别(NSString)和金额(NSDecimalNumber)

一个事务有一个值,我当前通过迭代分割对象的NSSet来计算该值,并将所有“Amount”属性相加

这工作正常,我似乎没有任何性能问题,但我怀疑当您有1000个事务时,这不会很好地扩展

我认为我需要做的是,在事务对象(作为cahce)上有一个“Amount”属性,并在每次对其NSSet中包含的一个“Split”对象的“Amount”属性进行更改时更新该属性

希望到目前为止我说的有道理

我的问题是实现这一目标的最佳方式是什么?这感觉像是KVO的设计初衷,但我以前从未真正使用过它。当我的事务对象的某个拆分的“金额”值发生更改并因此可以重新计算其自身的值时,是否需要通知我的事务对象

还是应该在分割中的Amount属性的setter中执行此操作

确定这是一个常见的问题,并且存在一个非常优雅的解决方案吗?非常感谢任何建议和示例代码


干杯

我会支持覆盖
金额
分割的设置
这样,如果有一天您需要优化或放大,您可以将一对多关系更改为没有反向的关系,从而完全保存集合的创建(删除反向时的删除强制将更加复杂)。

代码将类似于:

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

删除时,您需要减去
拆分的
金额:

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

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

如果删除分割对象,setter不会被调用,因此金额将不同步,不是吗?@olly在这种情况下,您可以捕获
prepareForDeletion