我目前正在遇到一个核心数据问题,在该问题中,我的子上下文中保存的所有数据都不会在调用时保存到其父级。保存的记录数量各不相同,这让我相信有一些竞争条件,但经过几个小时的考虑,我没有想法。
设置儿童语境
init(managedObjectContext: NSManagedObjectContext) {
_parentManagedObjectContext = managedObjectContext
// initialize managed object context
privateManagedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
// configure
privateManagedObjectContext.parentContext = _parentManagedObjectContext
super.init()
}
创建记录
private func insertPerson(name:String, hometown:String) {
let newPerson = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: privateManagedObjectContext) as! Person
newPerson.name = name
newPerson.hometown = hometown
}
保存记录
private func saveChanges(to moc:NSManagedObjectContext) {
guard privateManagedObjectContext.hasChanges else { return }
moc.performBlockAndWait {
do {
print("Saving \(moc.insertedObjects.count) objects")
moc.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
try moc.save()
if let parentContext = moc.parentContext {
self.saveChanges(to: parentContext)
}
} catch {
print("[ERROR] Could not save: \((error as NSError).localizedDescription)")
}
}
}
当我运行代码时,我得到类似下面的内容(假设应该插入50条记录):
Saving 50 records // privateManagedObjectContext
Saving 12 records // _parentManagedObjectContext
同样,父母插入的记录数量也各不相同,但通常不超过10-12条记录。我一直无法找到这个问题的明确原因,但感觉就像是在父母之前没有将对象保存到孩子的竞争条件,但这就是我使用performBlockAndWait
的原因。任何建议都非常感谢。