【问题标题】:NSFetchedResultsController/NSFetchRequest vs. NSManagedObject's to-many relationshipNSFetchedResultsController/NSFetchRequest 与 NSManagedObject 的多对多关系
【发布时间】: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 时我总是可以放弃获取控制器,但是对于托管对象,我认为这并不是那么简单。是这样吗?我很想使用直接关系。

提前致谢。

【问题讨论】:

    标签: objective-c cocoa-touch core-data nsfetchedresultscontroller nsfetchrequest


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。不,我没有太多,至少可以立即取出。我的猜测是 NSFetchedResultsControllerUITableViewController 的协作效果最好,因为缓存和延迟加载,对吧?感谢您提供有关故障的提示,我完全忘记了托管对象也可以清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多