ios - 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)
}
}
}
解决方案
如果您想将数据保存在磁盘上,您还应该将其保存在主上下文中。
因为如果 CoreData 上下文有父上下文,那么保存数据只需将更改移动到父上下文。
替代方案:我建议使用新的 API。你可以通过 NSPersistentContainer 来初始化 CoreData。它更易于使用。
它为 UI 创建单独的内容:
persistentContainer.viewContext
它可以自动合并对视图上下文的更改。
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
并通过非常简单的方式对后台队列执行操作:
persistentContainer.performBackgroundTask { context in
...
do {
try context.save()
}
catch {
print(error.localizedDescription)
}
...
}
推荐阅读
- java - 如何使用页面
使用 Spring WebClient 响应 - r - 我似乎无法从 arima 模型中获取我的预测数据以在 x 轴上绘制日期,或使用 ggplot2 进行绘制
- mocking - 如何发现当前的 LDAP 结构?
- php - 如何在php中以所需格式拆分字符串
- python - 没有从 opencv-python 拉普拉斯运算中得到预期的输出
- java - 在 javafx tabpane 的选项卡之间插入选项卡
- php - 如何使用 php laravel 代码将图像插入到 phpmyadmin
- audio - ffmpeg:仅映射(不同)特定语言的音频和字幕流
- javascript - 为什么在解析函数触发到 Firebase 时发生错误?
- python - 递归函数中的 ThreadPoolExecutor