在内存中缓存 CoreData 存储
Posted
技术标签:
【中文标题】在内存中缓存 CoreData 存储【英文标题】:Cache CoreData store in memory 【发布时间】:2011-12-31 17:46:14 【问题描述】:我有一个 CoreData 存储包含两种类型的实体 - Foo
和 Bar
由 SQLite 存储支持。预计Foo
的实例相对较少(约 1000 个),所有这些实例都非常频繁地被访问和遍历。另一方面,Bar
可以达到数百万,Bar
的每个实例都相对不经常访问。
我的问题是,CoreData 默认情况下是否已经针对这种类型的非对称访问进行了优化?如果没有,有没有办法告诉 coreData 总是将所有Foo
的实例缓存在内存中?
【问题讨论】:
【参考方案1】:您不需要两个上下文以及由此产生的所有麻烦。您可以做的是使用NSFetchRequest
将所有Foo
对象提取到内存中,这会给您想要的。
确保提取请求将includesPropertyValues
设置为YES
(默认)以提取所有数据。
【讨论】:
最初的问题说他有几百万个 Bar 实例。拥有 2 个独立的 MOC 将允许他定期重置Bar
MOC,这样这些对象就不会无缘无故地占用内存。它是更多的工作,但它绝对是 imo 的方式。
确实如此。不过,跨店关系确实很难管理。
Afaik 他没有提到任何关于这两个实体相关的事情。无论哪种方式,我都在考虑拥有 2 个对象 contexts,而不是存储。您将不得不使用 objectID 在 MOC 之间传递对象,但这并不像拥有多个商店那么糟糕。【参考方案2】:
只有在您访问它们时,实例才会被缓存到内存中。强制 CoreData 缓存您的所有 Foo
实例可能不是一个好主意,具体取决于最终的内存量。 CoreData 在自己管理内存方面非常聪明。
话虽如此,你可以做的是有两个独立的NSManagedObjectContexts
,一个用于Foo
,另一个用于Bar
。您可以在初始化 MOC 时预取所有 Foo 实例,它们将由 MOC 保留,直到您在其上调用 reset
(您可能希望在 Bar
MOC 上更频繁地执行此操作) .
【讨论】:
以上是关于在内存中缓存 CoreData 存储的主要内容,如果未能解决你的问题,请参考以下文章