objective-c - 具有内存存储的核心数据

标签 objective-c cocoa core-data

我想使用 Core Data 作为数据库服务器上更大数据集的缓存。 并非所有数据都会在内存中。

当进一步思考这个问题时,想到了 2 个问题:

  1. 故障(例如 1-n 关系)是否可以与内存中的持久存储一起使用,如果可以,您如何捕获故障触发?

  2. 核心数据管理对象上下文有一个陈旧间隔。这也适用于内存存储吗?

或者我应该为此目的使用 NSAtomicStore 吗?

最佳答案

您的第一个问题表明您误解了 NSInMemoryStore 类型持久存储的意图。它们是核心数据堆栈的持久存储部分。当您将实例带入托管对象上下文时,就会发生故障;创建了一个错误,它会在 NSPersistentStoreCoordinator 的缓存或底层持久存储中触发并填充自身。内存存储不会改变故障关系。显然,它不会真正帮助您解决问题,但是因为您必须持久所有数据到内存中。内存存储非常适合 (1) 测试(它们速度很快)和 (2) 临时核心数据堆栈,您希望在其中使用 Core Data 的对象图管理,而无需将任何内容保存到磁盘。

在回答你的第二个问题时,答案是肯定的。陈旧间隔适用于上下文,而不适用于持久存储。

那么,Core Data 是否适合缓存来自远程数据库服务器的数据?并不真地。尽管 Bill Bumgarner(一名 Apple 工程师)暗示这是可能的,但我发现在我自己的代码中将缓存与 Core Data 对象图管理分开要容易得多。使用 Core Data 来管理对象图和轻松绑定(bind)到 Controller/UI 层仍然非常好。所以我的策略是从数据库服务器中提取数据并将其缓存在我自己的数据结构中(OS X 10.6 中的 libcache 和 NSCache 可能是一个很好的起点)。然后决定您在对象图中想要什么,并将其迁移到核心数据堆栈(由内存中持久存储支持)。您必须自己处理来自数据库服务器的更改通知或轮询。当数据库中的数据更改(或用户查询更改等)时,我只是告诉所有编辑完成编辑,然后删除上下文并从(可能)更新的缓存中重建它。

关于objective-c - 具有内存存储的核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693475/

相关文章:

iphone - 来自 GCD 的线程读取旧值

ios - 在 WKWebView 中屏蔽广告

ios - 在 TableCells 中重新定位时出现问题

ios - 无法在 NSManagedObjects 之间建立关系

ios - 核心数据后台保存性能问题

iphone - Objective-C 自定义 Getter/Setter

iphone - 如何获取当前接入点的 MAC 地址/BSSID?

objective-c - Cocoa NSTextField 不可编辑,并随着 setSelectable 消失

cocoa - 来自字节数组的 NSImage

ios - GooglePlacePicker 不通过 cocoa pod 安装