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

时间:2013-01-20 13:43:53

标签: ios core-data

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

我看到下一个选项:

  • 在每次更改结束时保存上下文
  • 仅在应用退出时保存上下文(例如在Apple的示例中)
  • 在应用程序退出时保存上下文,转到后台或变为非活动状态(例如来电)
  • 添加计时器,以便在有任何更改的情况下不时保存上下文
  • 调用特别准备的延迟保存例程,该例程将收集调用以保存上下文以确保它们不会过于频繁地触发

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

另一方面,在应用程序的某些事件中保存(退出,转到后台等)将提供最佳性能,但是根据您的经验,您是否足以确保用户不会丢失数据?

4 个答案:

答案 0 :(得分:9)

我认为你应该经常保存,因为它更可靠(如果应用程序崩溃你不会丢失数据)并且你可以节省由修改但未使用的对象占用的内存。
与此同时,您不希望用保存请求压倒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/

答案 1 :(得分:4)

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

答案 2 :(得分:2)

我过去常常在每次更改时保存上下文,但性能确实不太好。目前我在提取数据功能结束时保存上下文。性能比4倍好。如果您打算在后台线程中调用异步函数,请确保在函数的开头和结尾有[context lock][context unlock]

答案 3 :(得分:2)

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