Objective c 核心数据何时刷新到磁盘?

Objective c 核心数据何时刷新到磁盘?,objective-c,core-data,ios5,Objective C,Core Data,Ios5,我在我的应用程序中使用了核心数据,发现了模拟器的一些奇怪行为:当我在我的应用程序中向核心数据添加一些数据并立即使用XCode中的“停止”按钮退出模拟器时(或者只需按Cmd-Q),下次启动模拟器时,数据不会存储在数据库中。经过一些测试,我发现数据存储在磁盘上: 如果我按home(主页)按钮,马上。(几乎-如果退出速度非常快,则可以在存储数据之前退出应用程序。) 如果在添加数据后让应用程序运行一段时间(至少20秒左右) 调用[NSManagedObjectContext save:]没有帮助。行

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

  • 如果我按home(主页)按钮,马上。(几乎-如果退出速度非常快,则可以在存储数据之前退出应用程序。)
  • 如果在添加数据后让应用程序运行一段时间(至少20秒左右)
调用[NSManagedObjectContext save:]没有帮助。行为是一样的


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

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

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


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

我也一直在努力解决这个问题,上面(2)项下的Daniel Eggert的答案是我在internet上找到的第一个也是唯一一个有用的答案。我假定JRV正在使用UIManagedDocument中的NSManagedDocumentContext。如果是这种情况,那么苹果的“默认”保存方法是不完整的!采用Daniel Eggert的解决方案后,我的数据现在可以完美地保存,并且不会受到模拟器“停止”手势的影响。我向希望在这种情况下编写弹性代码的任何其他人推荐Daniel Eggert在(2)项下的答案。

这是正确的。调用
[上下文保存:&错误];[[context-parentContext]保存:&错误]执行此任务,数据立即保存到磁盘。我必须执行这两个调用(这是合理的),但令人惊讶的是,我是否先调用saveoncontext或parentContext并不重要!你对此有什么解释吗?顺便说一句,作为对其他人的提醒:我自己没有设置嵌套上下文,所以这是在“幕后”进行的。你不能调用
[[context-parentContext]save:&error]
上下文
线程不安全(正如我指出的)。您需要调用
[[context-parentContext]performBlock:^(){[[context-parentContext]save:NULL]}](或类似)