ios - 核心数据在子上下文和父上下文中保存时生成重复值
问题描述
我在后台队列中有一个私有上下文,它负责“磁盘”上的写/读操作,所以这个上下文有一个对持久存储协调器的引用。然后,我在主线程中有一个队列作为我的子线程私人队列。
private lazy var saveManagedObjectContext: NSManagedObjectContext = {
let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
moc.persistentStoreCoordinator = self.coordinator
return moc
}()
private(set) lazy var managedContext: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.parent = self.saveManagedObjectContext
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return managedObjectContext
}()
问题是当我保存子上下文和父上下文时,我得到了重复。如果我不保存父上下文,则不会发生此问题,所以如果我只保存子 moc,它工作正常,但为什么呢?AFAIK 我们应该保存父上下文以将更改推送到数据库,因为父上下文具有对协调器的引用。
这是我保存上下文的方式:
extension NSManagedObjectContext {
private func saveOrRollback() {
performAndWait {
do {
if self.hasChanges {
try self.save()
}
} catch {
log(error, message: "Couldn't save. Rolling back.", tag: .coreData)
self.rollback()
}
}
if let parent = self.parent {
parent.perform {
if parent.hasChanges {
do {
try parent.save()
} catch {
log(error, message: "Couldn't save. Rolling back.", tag: .coreData)
parent.rollback()
}
}
}
}
}
func performChanges(block: () -> Void) {
block()
saveOrRollback()
}
}
解决方案
推荐阅读
- r - 闪亮的应用程序在所有浏览器上关闭,但资源管理器
- kubernetes - Calico:Kubernetes pod 使用集群 IP 无法互相 ping
- c++ - How to move cursor to end of text output after cin.clear() and cin.ignore()?
- node.js - 猫鼬 findByIdAndUpdate
- bash - awk 变量在 bash 中打印为选项
- json - 将 JSON-Patch 转换为 MarkLogic JSON 补丁规范?
- php - 关联数组更改键值
- regex - 查找所有不以 's 结尾的单词(包括缩写词)
- html - 线性渐变背景中的顶部边框半径
- r - 在 R Shiny 中,根据用户输入更新对象