首页 > 解决方案 > iOS Core Data:仅保存背景上下文就足够了吗?为什么或者为什么不?

问题描述

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

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

标签: iosswiftcore-data

解决方案


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

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

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

它为 UI 创建单独的内容:

persistentContainer.viewContext

它可以自动合并对视图上下文的更改。

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true

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

persistentContainer.performBackgroundTask { context in

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

推荐阅读