核心数据:保存结束时冻结

Posted

技术标签:

【中文标题】核心数据:保存结束时冻结【英文标题】:Core Data: Freeze at the end of a save 【发布时间】:2012-06-17 03:04:42 【问题描述】:

我目前有一个带有标签栏的 iPhone 项目。在标签栏上有两个视图。两个视图都将数据加载或保存到 Core Data 数据库(这两个视图都启动了一个从 Web 服务收集数据并将其保存在数据库中的方法)。加载视图时,它会从填充视图中的表的数据库中加载数据。如果我运行应用程序并单击选项卡栏中的第二个视图,则第一个视图仍在从 Web 服务加载数据并将其插入到单独线程上的数据库中。这很好,但是一旦第一个视图完成将所有数据从 web 服务加载到数据库中,只有当第二个视图控制器正在从数据库加载数据时,它才会冻结两个视图控制器。

控制台没有错误,xcode 也没有指示有任何错误。我所有的进程都在不同的线程上工作,所以主线程冻结没有问题。从 web 服务中提取数据并将其保存到数据库是一种方法,在方法的末尾我放了NSLog(@"View Controller 1 Save Complete")。一旦调用它并且第二个视图控制器仍在加载数据,它就会冻结。整个应用程序没有响应(没有任何反应)。

我查看了有关其他 SO 问题的信息,它建议我在每次提取或插入时声明一个新的 NSManagedObjectContext,我已经这样做了,但它并没有解决问题。

如果有人知道发生了什么或者您想了解更多信息,请告诉我。

编辑: 我正在使用 Xcode 4.5 和 ios 6 模拟器。这是一周前发布的新IOS的beta版。我知道这不是错误,因为我在开始使用 beta 版本之前就遇到了这个问题。

【问题讨论】:

请发布一些相关代码,包括您如何连接到网络服务。 @timthetoolman 我无法想象会有任何相关代码,因为这不是 Web 服务错误并且控制台中没有错误? 听起来您可能遇到了线程死锁。正如@timthetoolman 所说,我们需要查看一些代码以了解发生了什么。 @Sean 我不太确定我应该发布什么代码?我的项目中有 100 多个文件和数千行代码。 【参考方案1】:

我过去遇到的一种可能性是尝试在与创建它的线程不同的线程上与 MOC 交互。如果您尝试进行并发,则可能会发生这种情况,并且在与 MOC 交谈时,您必须非常小心地知道您始终处于哪个线程上。例如,对于异步事物,您的回调可能在与您想象的不同的线程上执行(即 viewDidLoad 发生在主线程上,因此如果您在那里创建 MOC,则以后不能从不同的线程中使用它)。

【讨论】:

以上是关于核心数据:保存结束时冻结的主要内容,如果未能解决你的问题,请参考以下文章

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

Python - 程序结束时将数据保存在文件中

Android 应用程序在完成活动时冻结,runOnUiThread() 停止工作

应用程序结束后具有 Hibernate 的 HSQLDB 不保存记录

运行时错误:CUDA 在训练结束时内存不足并且不保存模型;火炬

核心音频回调,录制开始或结束时的 inTimeStamp