Core Data 中父实体的计算属性

Posted

技术标签:

【中文标题】Core Data 中父实体的计算属性【英文标题】:Computed attribute of parent entity in Core Data 【发布时间】:2018-08-13 15:58:18 【问题描述】:

我有一个实体,它有一个名为“total”的属性。实体与自身有关系。与子实体的一对多关系和与父实体的一对一关系。 Graph

一个父母可以有很多孩子,每个孩子都可以有自己的孩子。 每个父母的总数等于其孩子总数的摘要。在更改子项总数或删除影响所有父项总数到根父项的子项时,我需要行为。

Example of parent-child tree

有什么解决办法吗?

【问题讨论】:

听起来你想要父母对子对象执行 KVO,但这需要所有对象都“活”在内存中,也就是分配的。不是一个很好的解决方案。我认为你需要做一个更加手动的过程,只要实体 X 的“总数”是“设置”,就执行手动核心数据查询以查找孩子包含实体 X 的任何父母并更新他们的总数,这将触发递归模式更新它的父母总价值。 你不能简单地刷新每个向上的父节点,让这部分成为改变树的一部分。 【参考方案1】:

首先,不清楚您所说的total 是什么意思。上一个你说它是一个财产,然后你还说它是根据它的孩子的价值来计算的。这对我来说意味着你有两个不同的属性。一种是value,对于有孩子的实体,通常(总是?)为零,另一种是total,它是根据其自身value 加上其所有孩​​子的value 和他们的孩子等等。我怀疑这是让你绊倒的主要想法。

第二个问题是计算total 的效率,这可能是一个很长的递归过程。首先,不要尝试预优化。如果您的图表只有几个深度,那么在需要时计算值很可能不是一个漫长的过程。当且仅当您发现它正在谈论很长时间并认为最好的方法是在图表中预先计算出总数,它应该不会那么难。

    在一个地方插入、删除节点或更改它们的值。应用程序中的所有更改都转到那个地方。 当一个节点被插入时,上图并将其值添加到其所有父节点的 total 属性中 当一个节点被移除时,上图并从其所有父节点的 total 属性中移除它的值 当一个节点的值发生变化时,上图并从其所有父节点的 total 属性中减去旧值与新值的差值

【讨论】:

以上是关于Core Data 中父实体的计算属性的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 中计算的持久属性

Core Data 计算属性总是返回 0

如何根据来自多个 Core Data 属性的计算值进行排序

Core Data 属性计数并在 TableView 中显示结果

如何确保从上下文而不是缓存中获取 Core Data Fetched Property?

SWIFTUI Core Data 传递数字