核心数据缓存 NSSet 属性

Posted

技术标签:

【中文标题】核心数据缓存 NSSet 属性【英文标题】:Core Data Cache NSSet Properties 【发布时间】:2013-04-19 13:35:30 【问题描述】:

不确定我的标题最能说明我的问题,但想不出更好的标题!

我有 2 个托管对象,“事务”和“拆分”。 Transaction 与“Split”具有一对多的关系,因此具有拆分对象的 NSSet。 Split 有 2 个属性,Category (NSString) 和 Amount (NSDecimalNumber)。

一个交易有一个值,我目前通过迭代拆分对象的 NSSet 来计算所有“金额”属性。

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

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

希望到目前为止我说得通..

我的问题是实现这一目标的最佳方式?感觉就像是 KVO 的设计初衷,但我之前并没有真正使用过它。当其中一个拆分的“金额”值发生变化并因此可以重新计算自己的值时,是否需要通知我的 Transaction 对象?

或者这应该在拆分中的 Amount 属性的设置器中完成??

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

干杯

【问题讨论】:

【参考方案1】:

我会覆盖Splitamount setter。 这样,如果有一天您需要优化或扩大规模,您可以将一对多关系更改为没有反向的关系,从而完全保存集合的创建(在删除反向的情况下执行删除会更复杂)。

代码如下所示:

//not tested
- (void) setAmount:(NSUInteger)amount

    [self willChangeValueForKey:@"amount"];
    [self setPrimitiveValue:@(amount) forKey:@"amount"];
    self.transaction.amount += amount;
    [self didChangeValueForKey:@"amount"];

编辑 (@Tommy):

删除时,您需要减去 Split 数量:

- (void) prepareForDeletion

    self.transaction.amount -= self.amount;

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

【讨论】:

如果一个拆分对象被删除,setter 不会被调用,这样数量就会不同步,不是吗? @olly 在这种情况下你可以捕捉到prepareForDeletion

以上是关于核心数据缓存 NSSet 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet

将核心数据对象设置为 NSSet

如何使用核心数据的添加和删除(NSSet)访问器方法?

Spark核心RDD什么是RDDRDD的属性创建RDDRDD的依赖以及缓存

核心数据麻烦排序相关对象的 NSSet

jQuery2.x源码解析(缓存篇)