21

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

我看到了下一个选项:

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

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

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

4

4 回答 4

11

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

于 2013-01-20T14:07:53.410 回答
4

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

于 2013-01-20T14:00:37.000 回答
4

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

于 2018-12-19T18:58:23.607 回答
2

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

于 2013-08-12T14:15:21.080 回答