首页 > 解决方案 > 核心数据在子上下文和父上下文中保存时生成重复值

问题描述

我在后台队列中有一个私有上下文,它负责“磁盘”上的写/读操作,所以这个上下文有一个对持久存储协调器的引用。然后,我在主线程中有一个队列作为我的子线程私人队列。

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()
    }
}

标签: iosswiftcore-data

解决方案


推荐阅读