NSFetchedResultsController/NSFetchRequest 与 NSManagedObject 的多对多关系

Posted

技术标签:

【中文标题】NSFetchedResultsController/NSFetchRequest 与 NSManagedObject 的多对多关系【英文标题】:NSFetchedResultsController/NSFetchRequest vs. NSManagedObject's to-many relationship 【发布时间】:2011-08-30 16:30:26 【问题描述】:

我在 ios 上展示了一个带有不同视图控制器的 NSManagedObject 层次结构(基本上是三个级别)。我不完全理解的问题是,如果每个视图控制器都需要NSFetchedResultsController。对于根视图控制器,这似乎很方便,但随后的视图基于前一个视图中的选择。与直接关系相比,NSFetchRequest 怎么样?显示的数据是静态的,永远不会改变,因此无需准备更新。它将从核心数据 sqlite 文件加载。

这是我所拥有的简单图形:

A (1) <---> (*) B (1) <---> (*) C

所以A-BB-C 关系都是一对多的,在根视图中我显示As 的列表。选择一个A 将在下一个视图控制器中显示它的Bs,依此类推。

我是使用NSFetchRequest(或NSFetchedResultsController)获取B 的实例还是仅使用A 中的多对多关系有什么区别?内存占用或内存不足的情况下是否有任何差异?我知道当didReceiveMemoryWarning 时我总是可以放弃获取控制器,但是对于托管对象,我认为这并不是那么简单。是这样吗?我很想使用直接关系。

提前致谢。

【问题讨论】:

【参考方案1】:

存在差异,但除非每个 A 都有数千个 B 和 C,否则您不必担心。

如果您使用该关系,那么您会得到一个 NSSet 回复 - 这不会使用 NSFetchedResultsController。但是,您返回的对象实际上并没有任何数据,它们都将作为故障开始,因此内存占用非常小。他们只会在您要求时检索他们的数据:)

如果您收到内存不足警告,您可以通过从上下文重新加载托管对象来强制它们再次成为故障(请参阅the docs here)。

【讨论】:

感谢您的回答。不,我没有太多,至少可以立即取出。我的猜测是 NSFetchedResultsControllerUITableViewController 的协作效果最好,因为缓存和延迟加载,对吧?感谢您提供有关故障的提示,我完全忘记了托管对象也可以清理。

以上是关于NSFetchedResultsController/NSFetchRequest 与 NSManagedObject 的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?