iOS核心数据:仅保存一个后台上下文就足够了吗?为什么?

iOS核心数据:仅保存一个后台上下文就足够了吗?为什么?,ios,swift,core-data,Ios,Swift,Core Data,我想知道,像下面的例子那样保存一个背景上下文是否足够,或者我还应该保存主上下文以及为什么 extension NSManagedObjectContext { private func saveOrRollback(context: NSManagedObjectContext) -> Bool { do { if context.hasChanges { try context.save()

我想知道,像下面的例子那样保存一个背景上下文是否足够,或者我还应该保存主上下文以及为什么

extension NSManagedObjectContext {
    

    private func saveOrRollback(context: NSManagedObjectContext) -> Bool {
        do {
            if context.hasChanges {
                try context.save()
                return true
            }
        } catch {
            log(error, message: "Couldn't save. Rolling back.", tag: .coreData)
            context.rollback()
            return false
        }
        return false
    }

    func performChanges(block: @escaping () -> Void) {
        let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        privateContext.parent = self
        privateContext.perform {
            block()
            _ = self.saveOrRollback(context: privateContext)
        }
    }
}

如果要将数据保存在磁盘上,还应将其保存在主上下文中

因为若CoreData上下文有父上下文,那个么保存数据只是将更改移动到父上下文

备选方案: 我建议使用新的API。您可以通过:NSPersistentContainer初始化CoreData。 它更容易使用

为用户界面创建单独的内容是:

persistentContainer.viewContext
它可以自动将更改合并到viewcontext

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
并通过非常简单的方式在后台队列上执行操作:

persistentContainer.performBackgroundTask { context in

    ...
            
    do {
        try context.save()
    }
    catch {
        print(error.localizedDescription)
    }
            
    ...
}
我想知道,像下面的例子那样保存一个背景上下文是否足够,或者我还应该保存主上下文以及为什么

extension NSManagedObjectContext {
    

    private func saveOrRollback(context: NSManagedObjectContext) -> Bool {
        do {
            if context.hasChanges {
                try context.save()
                return true
            }
        } catch {
            log(error, message: "Couldn't save. Rolling back.", tag: .coreData)
            context.rollback()
            return false
        }
        return false
    }

    func performChanges(block: @escaping () -> Void) {
        let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        privateContext.parent = self
        privateContext.perform {
            block()
            _ = self.saveOrRollback(context: privateContext)
        }
    }
}
核心数据管理对象上下文是工作空间;在保存之前,对数据所做的更改仅存在于该上下文中,此时更改的对象将写回数据存储。如果您在“背景”上下文中进行了要持久化的更改,则需要保存该上下文。如果您在要持久化的“主”上下文中进行了更改,则需要保存该上下文

如果两个上下文之间存在父/子关系,如果要在子上下文中永久保存更改,则需要先保存在子上下文中,然后保存在父上下文中。例如,如果“主”上下文是“后台”上下文的父存储,则在后台上下文中保存会将更改推送到主上下文,然后需要在主上下文中保存。(如果主上下文是其他上下文的子上下文,则需要一直保存链,直到到达根上下文。)