我使用-com.apple.CoreData.ConcurrencyDebug 1
确保每当我执行Core Data并发错误时崩溃。
我只是想将数据加载到后台,所以这是第一次尝试:
DispatchQueue.global(qos: .background).async {
let context = NSManagedObjectContext.getMainContext() // made up method
context.fetch(/* ... */)
}
果然,这会崩溃。也有意义,我们尝试从后台线程访问主要上下文。
第二次尝试:
DispatchQueue.global(qos: .background).async {
let context = NSManagedObjectContext.createPrivateContextAndAssignParent() // made up method
context.performAndWait {
context.fetch(/* ... */)
}
}
这很好用!我相信,这也是应该如何做的。所以没有真正的问题,但是......
在这种情况下也适用:
DispatchQueue.global(qos: .background).async {
NSManagedObjectContext.getMainContext()
context.performAndWait {
context.fetch(/* ... */)
}
}
我只是获取主线程的上下文,然后使用prformAndWait
访问它,它可以工作!它本应该崩溃! 为什么不崩溃?
谢谢!
编辑1:
整个背景:
DispatchQueue.global(qos: .background).async {
let stuff = findStuff()
}
func findStuff() -> NSArray? {
var stuff: NSArray?
let context = NSManagedObjectContext.getMainContext()
context.performAndWait {
stuff = context.fetch(/* ... */)
}
return stuff
}