4

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

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

调用 [NSManagedObjectContext save:] 没有帮助。行为是相同的。

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

4

3 回答 3

9

在 Xcode 中使用停止按钮停止模拟器可能与用锤子砸 iPhone 相同(但保留 SSD)。基本上,您的应用程序和其他所有内容都会停止。没有合理的方法可以确保在发生这种情况时保存数据。

于 2012-05-03T09:22:22.010 回答
7

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

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

于 2012-05-05T13:21:20.210 回答
0

我也为此苦苦挣扎了很长时间,丹尼尔·埃格特在上面(2)下的回答是我在互联网上找到的第一个也是唯一一个有用的答案。我认为 JRV 正在使用 UIManagedDocument 中的 NSManagedDocumentContext。如果是这种情况,那么 Apple 的“默认”保存方法是不完整的!采用 Daniel Eggert 的解决方案后,我的数据现在完美保存,并且不受模拟器“停止”手势的影响。我向其他希望在这种情况下编写弹性代码的人推荐 Daniel Eggert 在上面 (2) 下的答案。

于 2018-01-24T11:21:53.357 回答