viewContext.setQueryGenerationFrom 试图解决 CoreData 项目中涉及事务历史记录的什么问题?

Che*_*eng 3 core-data ios swift

我遇到过 2 个演示 CoreData 项目,其中涉及事务历史记录。

两者都在使用

viewContext.setQueryGenerationFrom(.current)
Run Code Online (Sandbox Code Playgroud)

当他们初始化 CoreData 堆栈时。


raywenderlich 的 FireballWatch 演示

该演示摘自https://www.raywenderlich.com/14958063-modern-efficient-core-data

作者试图演示如何利用事务历史记录,在批量插入后正确更新 UI。

然而,尚不清楚viewContext.setQueryGenerationFrom(.current)试图解决什么问题。

代码: https: //github.com/yccheok/FireballWatch_Materials/blob/main/final/FireballWatch/Model/Persistence.swift#L100

文章的简要解释https://www.raywenderlich.com/14958063-modern-efficient-core-data并没有过多讲述背后的想法setQueryGenerationFrom

您通过调用 setQueryGenerationFrom(_:) 将视图上下文固定到持久存储中的最新事务。但是,由于设置查询生成仅与 SQLite 存储兼容,因此仅当 inMemory 为 false 时才执行此操作。


将本地商店从 Apple 同步到云端

该演示选自https://developer.apple.com/documentation/coredata/synchronizing_a_local_store_to_the_cloud

它试图演示如何使用事务历史记录来防止与 CloudKit 同步后的数据重复。

然而,目前尚不清楚viewContext.setQueryGenerationFrom(.current)要解决什么问题。

代码:https://github.com/yccheok/SynchronizingALocalStoreToTheCloud/blob/main/CoreDataCloudKitDemo/DataProvider/CoreDataStack.swift#L89

关于这个想法背后没有给出太多解释setQueryGenerationFrom


实验

无论我在 CoreData 堆栈中包含viewContext.setQueryGenerationFrom(.current)还是排除viewContext.setQueryGenerationFrom(.current),我在这两种情况下都会得到相同的观察结果。

  • NSManagedObject在我保存一个新的, 并调用后,能够立即观察 UI 更新context.save
  • NSManagedObject在我编辑现有的并调用后,能够立即观察 UI 更新context.save
  • 在我执行批处理操作后,能够立即观察 UI 更新,NSBatchUpdateRequestmergeChanges调用。
  • 在我执行批处理操作后,能够立即观察 UI 更新,NSBatchDeleteRequestmergeChanges调用。

关于正在做什么有一些很好的图形解释setQueryGenerationFrom

https://cocoacasts.com/what-are-core-data-query- Generations

setQueryGenerationFrom然而,我无法将其与试图解决什么样的实际问题联系起来。

有谁知道,viewContext.setQueryGenerationFrom 在涉及事务历史的 CoreData 项目中试图解决什么问题? 如果有一个可靠的演示代码示例来展示 setQueryGenerationFrom 解决了什么样的问题,我们将不胜感激。谢谢。

Asp*_*eri 5

它只是固定一些上下文快照,因此您接下来的所有查询都与该快照一起工作,而与固定时刻之后发生的情况无关。这就像从 GitHub 上独立签出 - 每个人都可以继续,但你的工作没有沙箱。

这是一致性的保证,这可能是某些请求序列所需要的,在这些请求序列之间不应发生任何更改。

为了固定我们使用viewContext.setQueryGenerationFrom(.current)

要取消固定并继续使用 kind-of-HEAD,我们使用viewContext.setQueryGenerationFrom(nil)

Apple 的文章中有更多说明