【问题标题】:iOS Core Data: is enough saving only a background context? why or why not?iOS Core Data:仅保存背景上下文就足够了吗?为什么或者为什么不?
【发布时间】:2021-08-17 01:13:21
【问题描述】:

我想知道像下面的例子那样只保存背景上下文是否足够,或者我还应该保存主要上下文以及原因。

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

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    如果您想将数据保存在磁盘上,您还应该将其保存在主上下文中。

    因为如果 CoreData 上下文有父上下文,那么保存数据只需将更改移动到父上下文。

    替代方案: 我建议使用新的 API。你可以通过 NSPersistentContainer 来初始化 CoreData。 它更易于使用。

    它为 UI 创建单独的内容:

    persistentContainer.viewContext
    

    它可以自动合并视图上下文的变化。

    persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
    

    并通过非常简单的方式在后台队列上执行操作:

    persistentContainer.performBackgroundTask { context in
    
        ...
                
        do {
            try context.save()
        }
        catch {
            print(error.localizedDescription)
        }
                
        ...
    }
    

    【讨论】:

      【解决方案2】:

      我想知道像下面的例子那样只保存背景上下文是否足够,或者我还应该保存主要上下文以及原因。

      Core Data 托管对象上下文是一个工作区;在您保存之前,您对数据所做的更改仅存在于该上下文中,此时更改的对象将被写回数据存储。如果您在要保留的“背景”上下文中进行了更改,则需要保存该上下文。如果您在要保留的“主要”上下文中进行了更改,则需要保存 那个 上下文。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-15
        • 2018-03-23
        • 1970-01-01
        • 2012-07-27
        • 2020-05-19
        • 2012-04-05
        • 2017-10-05
        • 1970-01-01
        相关资源
        最近更新 更多