NSManagedObject 不是故障,但应用程序在后台线程上访问它时崩溃
NSManagedObject is not fault but app crashing on accessing it on backgroung thread
我遇到的问题是 NSManagedObject 在 MainThread 上没有显示问题,但是在后台线程中访问同一个 NSManagedObject 时,它显示错误:
错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
我实际上不知道为什么会这样。
我正在使用 peform{} 块方法通过 mainContext 获取此 NSManagedObject。
所以这个返回的对象在主线程上工作正常但是在后台线程中访问这个对象时,我崩溃了。
我不清楚我应该提供什么额外的信息来描述我的问题。
如果有人对我的问题有任何想法,请告诉我。
托管对象(和上下文)只能从特定线程访问。如果你想从后台线程访问托管对象,你需要创建一个具有私有队列并发的上下文,然后使用 performBlock:
方法。
let bgContext = NSManagedObjectContext(concurrencyType: privateQueueConcurrencyType)
bgContext.perform {
// code which accesses managed object
}
如果你需要从主线程中取出一个特定的实体并在后台访问它,你可以从主线程中取出对象的managedObjectID
,然后在后台块中调用existingObject(with:)
在后台上下文中获取相同的实体。
我遇到的问题是 NSManagedObject 在 MainThread 上没有显示问题,但是在后台线程中访问同一个 NSManagedObject 时,它显示错误: 错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
我实际上不知道为什么会这样。
我正在使用 peform{} 块方法通过 mainContext 获取此 NSManagedObject。 所以这个返回的对象在主线程上工作正常但是在后台线程中访问这个对象时,我崩溃了。
我不清楚我应该提供什么额外的信息来描述我的问题。
如果有人对我的问题有任何想法,请告诉我。
托管对象(和上下文)只能从特定线程访问。如果你想从后台线程访问托管对象,你需要创建一个具有私有队列并发的上下文,然后使用 performBlock:
方法。
let bgContext = NSManagedObjectContext(concurrencyType: privateQueueConcurrencyType)
bgContext.perform {
// code which accesses managed object
}
如果你需要从主线程中取出一个特定的实体并在后台访问它,你可以从主线程中取出对象的managedObjectID
,然后在后台块中调用existingObject(with:)
在后台上下文中获取相同的实体。