iOS:来自iOS14 EXC_BAD_访问线程队列的随机错误消息:NSManagedObjectContext NSInternalAdditions ForgeToObject PropagateToObject Store
自从新安装的iOS 14.0以来,我有一个奇怪的bug,当我点击一个tableview时,或者当我点击一个按钮时,或者当我打开一个弹出窗口时,就会触发这个bug。它是非常随机的,很难完美地复制。xcode的控制台对这个问题不是很健谈。我在线程中有以下错误消息: //错误示例1 #4 0x0000000189c378e8 in-[NSManagedObjectContext(\u NSInternalAdditions)\u ForgeToObject:传播对象存储:removeFromRegistry:() 主要观点是: 线程12:EXC\u错误访问(代码=1,地址=0x4) //错误示例2 //错误示例3iOS:来自iOS14 EXC_BAD_访问线程队列的随机错误消息:NSManagedObjectContext NSInternalAdditions ForgeToObject PropagateToObject Store,ios,objective-c,swift,uitableview,nsmanagedobjectcontext,Ios,Objective C,Swift,Uitableview,Nsmanagedobjectcontext,自从新安装的iOS 14.0以来,我有一个奇怪的bug,当我点击一个tableview时,或者当我点击一个按钮时,或者当我打开一个弹出窗口时,就会触发这个bug。它是非常随机的,很难完美地复制。xcode的控制台对这个问题不是很健谈。我在线程中有以下错误消息: //错误示例1 #4 0x0000000189c378e8 in-[NSManagedObjectContext(\u NSInternalAdditions)\u ForgeToObject:传播对象存储:removeFromRegis
它说NSManagedObjectContext的线程导致了崩溃。
我很难得到更多关于这个错误的信息
有什么想法吗?错误表明CoreData操作在它应该执行的另一个线程上执行 根据,您可以使用
perform()
(异步)或performAndWait()
(同步)来确保在正确的队列中执行调用
您可以使用中基于队列的并发类型来使用上下文
与perform(:)和performAndWait(:)结合使用。你们组
要发送到要传递到的块内上下文的“标准”消息
这些方法之一。有两个例外:
上的Setter方法
基于队列的托管对象上下文是线程安全的。您可以调用
这些方法直接用于任何线程
如果您的代码正在
在主线程中,可以在主队列样式上下文中调用方法
直接而不是使用基于块的API
执行(:)和执行等待(:)确保在
为上下文指定的队列。perform(:)方法返回
立即,上下文自行执行块方法
线使用performAndWait(:)方法,上下文仍会执行
块方法在它自己的线程上,但该方法不返回
直到执行块为止
当您初始化上下文时,它将附加到某个队列,您不知道是哪个队列,但通过调用该方法(perform或PerformdWait),您将确保在正确的队列中执行该操作。您是否希望在主线程中操作CoreData操作,而在另一个队列(线程12)中执行了某些操作?@Larme我正在CoreData中写入一个值,它正在TableView中显示它。或者我想显示一个弹出窗口,它是初始化CoreData中的值。这是两个示例您应该编写
yourManagedContext.perform{}
(或performAndWait()
)以确保在正确的线程中调用它。我想这就是问题所在,这就是问题所在。我使用了managedObjectContext=[[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType],应该改用NSMainQueueConcurrencyType。谢谢你,你为我节省了很多时间。您可以把它放在答案中,我将验证它(通过添加代码)。