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)
}
}
}
核心数据管理对象上下文是工作空间;在保存之前,对数据所做的更改仅存在于该上下文中,此时更改的对象将写回数据存储。如果您在“背景”上下文中进行了要持久化的更改,则需要保存该上下文。如果您在要持久化的“主”上下文中进行了更改,则需要保存该上下文
如果两个上下文之间存在父/子关系,如果要在子上下文中永久保存更改,则需要先保存在子上下文中,然后保存在父上下文中。例如,如果“主”上下文是“后台”上下文的父存储,则在后台上下文中保存会将更改推送到主上下文,然后需要在主上下文中保存。(如果主上下文是其他上下文的子上下文,则需要一直保存链,直到到达根上下文。)