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

zub*_*bko 14 core-data ios

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

我看到下一个选项:

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

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

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

Evg*_*kov 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];
}
Run Code Online (Sandbox Code Playgroud)

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


And*_*law 4

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