核心数据关系计数更新

时间:2010-08-17 01:58:45

标签: iphone core-data relationship

我有一个包含博客群组,博客和帖子的核心数据模型。博客组与博客有很多关系,每个博客都与帖子有很多关系。帖子的属性为“hasBeenRead”。博客和博客组都有一个属性“numberUnreadPosts”。

我想知道通过每个关系传播未读帖子数量的最佳做法。例如,如果我阅读帖子,我想在博客和博客组中将未读帖子的数量减少一个。谢谢!

3 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。

KVO观察员

您的BlogGroup可以监视Blog实体-numberUnreadPosts属性的更改,当它发生更改时,它可以自行更新。

同样,您的博客可以监视Post实体-hasBeenRead属性的更改,当它发生更改时,它可以自行更新,这会自动传播到BlogGroup。

这种设计的问题在于它假设BlogGroup和Blog实体都在内存中(因为你会在-awakeFromFetch方法中打开观察者)。情况可能并非总是如此,我发现最好不要依赖这种情况。

传播更新

当帖子更改-hasBeenRead属性时,您可以覆盖设置器并让它调用它的父(博客)并告诉它有关更改。然后博客会更新它自己的未读计数,并告诉BlogGroup它已更新。

这种设计更加一致,不太可能失败。然而,由于波纹,它可能会产生不可预见的后果。当您更改帖子时,会将许多对象提取到内存中进行更新。

或者不用担心

第三种选择是只有帖子实际上有值。然后,您可以在Blog和BlogGroup上生成一个便捷方法,它只计算来自下面对象的未读内容。

这很简单,但它不是可观察的属性,因此可能无法在您的设计中使用。

您的应用程序的设计将决定哪种设计更适合您。如果您知道在使用帖子时将始终实现BlogGroup和博客,那么选项是一个更好的解决方案imho。

答案 1 :(得分:0)

这听起来像是Fetched Properties

的工作

答案 2 :(得分:0)

如果不使用获取的属性(我没有做过 - 也许这是正确的方法),我会从Posts向上移动。使用hasBeenRead == NO的谓词为实体Post创建获取请求。迭代生成的数组使用反向关系来识别博客拥有每个帖子和BlogGroup拥有每个博客并创建两个词典。

第一个字典有Post-> Blog的唯一名称作为键,如果没有该条目,那么你创建并存储[NSValue valueWithInt:1]的键,否则增加其中的内容。第二个字典是相同的,但有Post-> Blog-> BlogGroup的id作为键。通过查看为相关密钥存储的值,可以找到Blog或BlogGroup的未读计数。

您需要在程序启动时执行一次完整计数,然后在将帖子从未读更改为读取时关注关系并更新计数。