iOS:来自iOS14 EXC_BAD_ACCESS线程队列的随机错误消息:NSManagedObjectContext NSInternalAdditions

问题描述

自从新安装iOS 14.0起,我有一个奇怪的错误,它是在单击表视图时,单击按钮或打开弹出窗口时触发的。它是非常随机的,并且很难完美再现。 xcode的控制台对此问题不是很健谈。我在线程中有此错误消息:

//错误示例1

-[NSManagedobjectContext(_NSInternalAdditions)_forgetobject:propagatetoObjectStore:removeFromregistry:]()中的#4 0x0000000189c378e8

这在主视图中:

线程12:EXC_BAD_ACCESS(代码= 1,地址= 0x4)

Window1

Window2

//错误示例2

Window1

Window2

//错误示例3

Window1

Window2

它表示NSManagedobjectContext的线程导致崩溃。

enter image description here

我在获取有关该错误的更多信息方面遇到问题...

有什么想法吗?

解决方法

该错误表明有一个CoreData操作在与它应该执行的线程不同的另一线程上完成。

根据doc,您可以使用perform()(异步)或performAndWait()(同步)来确保您在正确的队列中进行呼叫。

您使用上下文中的基于队列的并发类型来使用上下文 与perform( :)和performAndWait( :)结合使用。你组 要发送到块中上下文的“标准”消息,然后传递给 这些方法之一。有两个例外:

设置方法 基于队列的管理对象上下文是线程安全的。您可以调用 这些方法直接在任何线程上。

如果您的代码正在 主线程,您可以在主队列样式上下文上调用方法 直接代替使用基于块的API。

perform( :)和performAndWait( :)确保在 为上下文指定的队列。 perform( :)方法返回 立即执行,并且上下文自行执行块方法 线。使用performAndWait( :)方法,上下文仍将执行 块方法在其自己的线程上,但该方法不会返回 直到执行该块。

初始化上下文时,它将附加到某个队列,您将不知道是哪个队列,但是通过调用该方法(perform或performAndWait),您一定会在正确的队列中进行操作。