我遇到的问题是NSManagedObject没有在MainThread上显示问题,但是在后台线程中访问同一个NSManagedObject时,它显示错误: 错误:执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)
我实际上并不知道为什么会这样。
我使用peform {}块方法通过mainContext获取此NSManagedObject。 所以这个返回的对象在主线程上运行正常但是在后台线程中访问这个对象时,我正在崩溃。
我不清楚我应该提供哪些额外信息来描述我的问题。
如果有人对我的问题有任何疑问,请告诉我。
答案 0 :(得分:2)
只能从特定线程访问托管对象(和上下文)。如果要从后台线程访问托管对象,则需要使用专用队列并发创建上下文,然后使用performBlock:
方法。
let bgContext = NSManagedObjectContext(concurrencyType: privateQueueConcurrencyType)
bgContext.perform {
// code which accesses managed object
}
如果您需要从主线程中获取特定实体并在后台访问它,您可以从主线程中获取对象的managedObjectID
,然后在其中调用existingObject(with:)
background块用于在后台上下文中获取相同的实体。