Core Data何时刷新到磁盘?

时间:2012-05-03 09:13:40

标签: objective-c core-data ios5

我在我的应用程序中使用Core Data,并发现了模拟器的一些奇怪的行为:当我在我的应用程序中向Core Data添加一些数据并使用XCode中的“stop”按钮退出模拟器时(或者只是按下Cmd-Q )立即,下次启动模拟器时数据不会存储在数据库中。经过一些测试,我发现数据存储在磁盘上:

    如果我按下主页按钮,立即
  • 。 (几乎 - 如果退出非常快, 可以在存储数据之前退出应用程序。)
  • 如果我在添加数据后让应用程序运行一段时间(至少约20秒)。

调用[NSManagedObjectContext save:]无效。行为是一样的。

所以我的问题是:这种行为的原因是什么?在退出之前有没有办法强制刷新到磁盘?在设备上运行时,我是否有以这种方式丢失数据的风险(个人而言,除了强制关闭之外我没有看到任何数据,但奇怪的行为让我感到烦恼)

3 个答案:

答案 0 :(得分:9)

使用Xcode中的停止按钮停止模拟器可能与使用锤子粉碎iPhone(但保留SSD)相同。基本上,你的应用程序和其他一切都停止了。当发生这种情况时,没有合理的方法来确保数据被保存。

答案 1 :(得分:7)

你可能正在使用嵌套的上下文。如果您的上下文具有父上下文,则调用-save:将只保存到该上下文,而不是文件系统。

嵌套上下文(通常)用于安全地在后台队列上使用上下文,并允许前台上下文保存,而不必承担保存到文件系统的开销。保存到文件系统将在后台队列上进行,而不是阻塞主线程。

答案 2 :(得分:0)

我也一直在努力解决这个问题,Daniel Eggert在上面(2)中的回答是我在互联网上找到的第一个也是唯一有用的答案。我假设JRV正在使用UIManagedDocument中的NSManagedDocumentContext。如果是这种情况,则Apple的“默认”保存方法不完整!采用了Daniel Eggert的解决方案后,我的数据现在完全保留,并且也不受模拟器“停止”手势的影响。我建议Daniel Eggert在上面的(2)中给予其他希望在这种情况下编写弹性代码的人。