在内存中缓存 CoreData 存储

Posted

技术标签:

【中文标题】在内存中缓存 CoreData 存储【英文标题】:Cache CoreData store in memory 【发布时间】:2011-12-31 17:46:14 【问题描述】:

我有一个 CoreData 存储包含两种类型的实体 - FooBar 由 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 存储的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图 SDK - 核心数据

使用 coredata 存储/缓存非标准数据类型

是否需要缓存CoreData返回的数据?

与此上下文的 CoreData SwiftUI 错误不同的 NSManagedObjectModel

具有内存存储的核心数据

如何将 CoreData SQLite 支持的持久存储克隆到“内存中”?