根据实体之间的关系类型创建 NSFetchedResultsController 部分
Posted
技术标签:
【中文标题】根据实体之间的关系类型创建 NSFetchedResultsController 部分【英文标题】:Creating NSFetchedResultsController sections based on type of relationship between entities 【发布时间】:2013-07-16 05:25:46 【问题描述】:在我正在开发的应用程序中,我有一个核心数据模型,它具有 Users 和 Widgets,其中用户可以拥有许多 Widget 作为他们的 owner 或将小部件作为众多观察者之一。对于我的应用程序中的屏幕,我想显示一个包含两个部分的表格视图:第一个列出给定用户拥有的小部件,而另一个显示用户正在观看的小部件。
因此,基本上这归结为基于给定 Widget 是否通过 watchers 或 owner 关系与用户相关的部分。有没有简单的方法来实现这一点?
【问题讨论】:
【参考方案1】:您可以在用户和小部件之间建立两种关系。用户实体将拥有拥有小部件和监视小部件,而小部件实体将拥有所有者和观察者。
User Widget
------ --------
ownedWidgets <----->> owner
watchedWidgets <<-->> watchers
编辑
没有注意到问题标题中的NSFetchedResultsController
!您遇到的问题是 FRC 使用 sectionNameKeyPath
属性来确定基于一个属性的部分。您已经使用关系完成了这项工作,并且没有一个属性可以涵盖这两种情况。
我的建议是从特定的用户实例 ownedWidgets
和 watchedWidgets
创建两个数组,使用您在 FRC 中使用的相同排序描述符进行排序,并将它们用于表视图。当 FRC 更新行时,您可以在调用 [tableView endUpdates] 之前重新创建这些数组。无需更改数据模型以适应一种视图控制器设计。
坦率地说,如果您已经拥有 User 对象,那么您已经通过关系获得了所需的小部件,因此您实际上不需要获取任何东西。您可能需要考虑是否真的需要 FRC。
如果您确实需要使用 FRC - Erik H. 的答案将是您的最佳选择。
【讨论】:
是的,这基本上就是我现在设置数据模型的方式;那不是问题。问题是我想根据它们是否与ownedWidgets
或watchedWidgets
属性相关来将小部件拆分为多个部分。
是的,更新后的建议是我过去解决此问题的方式 - 如果您想自己做一些额外的工作来管理更改,这是一个好方法。但是,如果您确实想使用 FRC,我认为我的答案是可行的。
这似乎是建议的最佳方法。今晚我将尝试实施这种方法。【参考方案2】:
这取决于您的数据模型。我认为一种方法可以通过使用中间对象UserWidget
并为关系类型、所有者或观察者具有属性(如relationshipType
)来实现这一点。那么你的 fetch 可以在 UserWidgets
上,sectionNameKeyPath
可以是 relationshipType
。
【讨论】:
这实际上似乎是一个很好的解决方案。也许有点数据库,但如果 UserWidget 连接实体只是对常规关系增加了一层冗余,它可能会起作用。以上是关于根据实体之间的关系类型创建 NSFetchedResultsController 部分的主要内容,如果未能解决你的问题,请参考以下文章