使用线程时的核心数据问题

Posted

技术标签:

【中文标题】使用线程时的核心数据问题【英文标题】:Core Data problems when using threads 【发布时间】:2012-12-08 23:40:40 【问题描述】:

我正在从事一个爱好项目,我会在业余时间慢慢更新,以帮助学习一些新事物。我遇到的一个绊脚石是在一个单独的线程中使用 Core Data。我已经阅读了 Apple 关于 Core Data concurrency 的文档,并且我阅读的所有内容看起来都很简单,因此我开始更新我的项目以在后台线程上加载数据,因为我不想在加载时锁定 UI。

如果 Core Data 对象加载到主线程上,该项目可以正常工作。如果我切换到后台加载,它会崩溃。

在这个阶段,我可以验证:

NSManagedObject 加载到线程上,我可以访问它的属性 将数据输出到标准输出可以正常工作并且看起来正确。 主线程上加载的数据对象和后台线程上加载的数据的二进制比较证明它们是相同的。

当我在 NSData 上调用类别实现时,就会出现实际问题。我可以验证 NSData 对象在后台线程上加载时是否正常,只有当我在加载后调用函数对 NSData 对象进行一些工作时,我才会遇到问题。问题是 EXC_BAD_ACCESS,这通常意味着对象的地址是错误的,但它没有任何意义。

我可能只是得到了一些明显或简单的错误 - 但我就是只见树木不见森林。

如果您认为您可以就此提供任何建议,因为它让我发疯,那么您可以在此处找到代码:

编辑帖子答案:已删除 URL,因为项目不再存在。

【问题讨论】:

鉴于EXC_BAD_ACCESS,怀疑僵尸。你能用 Instruments 来澄清一下吗?我还注意到在ProcessWindowControllerdoIt 方法中,您的NSManagedObjectContext 分配是否向后?当THREADED_PROCESSING 定义和context 定义时,您似乎分配了线程上下文。 哦,是的,我肯定为当前版本分配了错误的上下文,但将其切换到我想要的方式并没有任何区别。我一直在玩这个有一段时间我没有取得太大的成功。默认情况下,我为开发构建启用了僵尸对象,并且可以验证 Instruments 没有接收到任何东西。当我通过 Instruments 运行应用程序时,应用程序会崩溃。使用调试器,我得到一个 EXC_BAD_ACCESS 代码 2。 刚刚推送修复,因为上下文是错误的方式,以便定义使用线程处理。感谢您指出这一点。 【参考方案1】:

好的,我终于找到了问题所在。解压方法超出了线程的堆栈大小,因此导致一个奇怪的随机 EXC_BAD_ACCESS 被触发。

我本来希望调试器在这种情况下产生更直接的线索。

因此,一个有效的“堆栈溢出”问题已解决。

【讨论】:

以上是关于使用线程时的核心数据问题的主要内容,如果未能解决你的问题,请参考以下文章

使用pthread_create时的“分段错误(核心转储)”

保存时的核心数据问题[关闭]

使用核心蓝牙时的问题

将数据插入核心数据时的奇怪行为

核心数据:使用延迟实例化时的奇怪错误行为

线程池工作机制