我有这个核心数据模型:
有时,当我尝试插入“BoissonCave”元素时,我的应用程序会崩溃。这就是它发生的地方(我正在从包含 JSON 数据的数组“值”中读取数据):
let boissonCave = BoissonCave(context: context)
[...]
if let _regionId = values["regionId"] as? Int16 {
let region = CoreDataStack.sharedInstance.getRegion(ofId: Int(_regionId))
boissonCave.fromRegion = region
}
我遇到了不同的错误,无论是在核心数据获取“区域”时,还是在我尝试分配 boissonCave 的 fromRegion 时。要么是
EXC_BAD_ACCESS
'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'
甚至*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x174259c80> was mutated while being enumerated.'
我怀疑这是一个上下文问题,Core Data 试图在一个上下文中获取一个区域,并在另一个上下文中插入一个 BoissonCave?我应该如何解决这个问题?
最佳答案
基于 CoreDataStack .为什么不使用 1 个静态核心数据堆栈?并在需要时创建子上下文。您始终可以将对子项的更改合并到主上下文中。这是我自 iOS 10.0 以来使用的上述 url 的略微修改版本
class CoreDataStack {
static let shared = CoreDataStack()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Almanapp")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error {
fatalError("Unresolved error \(error)")
}
})
return container
}()
var context : NSManagedObjectContext {
return self.persistentContainer.viewContext
}
func saveContext() {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch let error as NSError {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
}
}
关于ios - 将关系插入核心数据的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41702876/