在Core Data中有效获取多对多关系中的最新记录

时间:2016-05-23 05:05:55

标签: ios swift core-data one-to-many

我在ChannelMessage之间存在多对多的关系,即一个频道可以有多条消息,而一条消息只属于一个频道。我想有效地获取最后一条消息和频道。请注意,频道可能包含大量邮件。我可以想到几个不同的选择:

  1. 使消息成为Channel上的有序关系并获取最后一条消息(使用Swift中的messages.last) 潜在问题:根据我有限的经验,可能会有一些演员表,因为NSOrderedSet不支持像Set这样的泛型。我还读到Core Data,Xcode和Swift中有序关系的组合总体上有一些怪癖,所以不确定。
  2. 在Channel上使消息成为无序关系,并使用Message上的获取请求获取最后一条消息(按时间戳desc排序) 潜在问题:每次访问最后一条消息时都需要获取请求,这可能是潜在的性能问题。
  3. 在Channel上添加一个名为lastMessage的额外一对一关系,并始终保持更新。然后,使用单个提取请求预取lastMessage关系以及Channels。 潜在问题:确保lastMessage保持同步的其他代码。
  4. 为了进一步扩展这个问题,如果我想获取最后n条消息而不是最后一条消息,那么建议的方法是什么?

    非常感谢!

1 个答案:

答案 0 :(得分:1)

我认为你的选择2是最坚实的选择。您可以使用一些技巧来确保有效获取,因此我认为您不会遇到任何性能问题。

选项3也是可行的,也没有太大的努力。设置频道时,只需实施didSet即可。但是,它并不是那么干净,也无法帮助你的最后一条消息"问题。

按日期排序是非常有效的。诀窍是在获取请求上设置适当的排序描述符,然后将fetchLimit设置为n,或者如果您要查找最后一条消息,则设置为1

请务必检查"未找到"或"发现少于n"错误条件并适当地处理它们。