iOS核心数据:只保存一个背景上下文就足够了吗?为什么



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

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。您可以通过以下方式初始化CoreData:NSPersistentContainer。它更容易使用。

它为UI:创建分离的内容

persistentContainer.viewContext

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

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true

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

persistentContainer.performBackgroundTask { context in
...

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

...
}

最新更新