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
-B
和B
-C
关系都是一对多的,在根视图中我显示A
s 的列表。选择一个A
将在下一个视图控制器中显示它的B
s,依此类推。
我是使用NSFetchRequest
(或NSFetchedResultsController
)获取B
的实例还是仅使用A
中的多对多关系有什么区别?内存占用或内存不足的情况下是否有任何差异?我知道当didReceiveMemoryWarning
时我总是可以放弃获取控制器,但是对于托管对象,我认为这并不是那么简单。是这样吗?我很想使用直接关系。
提前致谢。
【问题讨论】:
【参考方案1】:存在差异,但除非每个 A 都有数千个 B 和 C,否则您不必担心。
如果您使用该关系,那么您会得到一个 NSSet
回复 - 这不会使用 NSFetchedResultsController
。但是,您返回的对象实际上并没有任何数据,它们都将作为故障开始,因此内存占用非常小。他们只会在您要求时检索他们的数据:)
如果您收到内存不足警告,您可以通过从上下文重新加载托管对象来强制它们再次成为故障(请参阅the docs here)。
【讨论】:
感谢您的回答。不,我没有太多,至少可以立即取出。我的猜测是NSFetchedResultsController
与 UITableViewController
的协作效果最好,因为缓存和延迟加载,对吧?感谢您提供有关故障的提示,我完全忘记了托管对象也可以清理。以上是关于NSFetchedResultsController/NSFetchRequest 与 NSManagedObject 的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章