最佳核心数据保存策略(何时将数据保存到磁盘)

Posted

技术标签:

【中文标题】最佳核心数据保存策略(何时将数据保存到磁盘)【英文标题】:Best Core Data save strategy (when to save data to disk) 【发布时间】:2013-01-20 13:43:53 【问题描述】:

根据您的经验,对于仅使用一个仅使用一个主线程的 NSManagedObjectContext 的 ios 应用程序,在可靠性和性能方面,将用户设置和缓存数据从服务器持久保存到磁盘的最佳方法是什么?

我看到了下一个选项:

在每次更改结束时保存上下文 仅在应用退出时保存上下文(如在 Apple 的示例中) 在应用退出、进入后台或变为非活动状态(例如来电)时保存上下文 如果上下文有任何变化,添加计时器以不时保存上下文 调用专门准备的延迟保存例程,该例程将收集调用以保存上下文,以确保它们不会频繁触发

目前我们使用第一个选项,所以我可以说它的可靠性非常好,即使在调试会话期间Xcode终止应用程序后数据也会保存,但是当应用程序变得越来越复杂时,性能可能会受到影响,尤其是.由于从服务器异步加载数据,可能在应用程序流程的任何时刻发生对数据库的更改。

另一方面,在应用程序的某些事件(退出、进入后台等)时保存将提供最佳性能,但您能否根据您的经验说,确保用户不会丢失数据就足够了?

【问题讨论】:

【参考方案1】:

我认为您应该经常保存,因为它更可靠(如果应用崩溃,您不会丢失数据),并且您可以节省被修改但未使用的对象占用的释放内存。 同时,您不想让您的保存请求淹没 db。 我的建议是在接口文件中公开两个方法,根据自己的情况选择要调用的方法。

- (void)save 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(save) object:nil];
    [_storage save:nil];


- (void)setNeedsSave 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(save) object:nil];
    [self performSelector:@selector(save) withObject:nil afterDelay:1.0];

另外,您是否考虑过将第二个托管对象上下文与私有队列一起使用?您可以将其设置为父上下文并在后台保存/获取数据:http://www.cocoanetics.com/2012/07/multi-context-coredata/

【讨论】:

感谢您的链接,尽管简单的解决方案被证明不太容易出错,但在 100% 需要之前,我们同意不使用多线程核心数据。【参考方案2】:

UIApplicationDelegate 方法applicationDidEnterBackground:applicationWillTerminate: 中保存上下文对我来说一直很好。我还会在特殊情况下保存,例如大数据导入或类似情况。

【讨论】:

【参考方案3】:

根据 Apple 文档 “建议您在应用程序执行期间的适当时间点保存用户数据,通常是为了响应特定操作。例如,当用户关闭数据输入屏幕时保存数据。不要依赖特定的应用程序状态转换来保存您应用的所有关键数据”。

【讨论】:

【参考方案4】:

我曾经在每次更改时保存上下文,但性能确实不是那么好。目前我将上下文保存在获取数据函数的末尾。性能好 4 倍。如果您打算在后台线程中调用函数异步,只需确保在函数的开头和结尾都有[context lock][context unlock]

【讨论】:

以上是关于最佳核心数据保存策略(何时将数据保存到磁盘)的主要内容,如果未能解决你的问题,请参考以下文章

代码中哪里是保存核心数据的最佳位置?

将获取的数据保存在磁盘上

核心数据模型对象保存的最佳实践

核心数据 - 在后台保存到磁盘上的持久存储

核心数据:NSManagedObject 何时插入上下文并保存?

核心数据请求和保存的最佳实践