概述
在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0,并为其加入了全新的 History Trace、“墓碑”等诸多激动人心的新功能。那么它们到底如何实际应用到我们的 App 中去呢?
想搞清楚历史记录追踪(History Trace)如何在 SwiftData 2.0 中大放异彩吗?看这篇就对了!
在本篇博文中,您将学到如下内容:
- 概述
- 7. 拯救者:History Trace!
- 8. ModelContext.autosaveEnabled 开启并不保证改变会自动 save
- 总结
这是本系列第四篇博文。闲言少叙,让我们马上开始 SwiftData 精彩的探究之旅吧!
Let‘s dive in!!!😉
7. 拯救者:History Trace!
为了通过历史记录追踪机制(History Trace)来更雅致地将后台线程中数据的修改与界面之间进行同步,我们需要分几步来完成。
第一步,为了区分主上下文和私有上下文对持久数据所做的更新,我们需要为模型上下文对象打上“标签(author)”:
Task.detached {
let modelContext = ModelContext(.preview)
// 为上下文对象添加“标签”
modelContext.author = "BG"
let item = Item(name: "\(Int.random(in: 0...10000))")
modelContext.insert(item)
try! modelContext.save()
await MainActor.run {
...
}
}
这样一来我们就可以只关心私有上下文产生的更改,而完全忽略主上下文所做变更了。
当然,为了更具效率的使用 History Trace 机制,我们还可以根据时间令牌(DefaultHistoryToken)来进一步筛选所需的历史记录。
限于篇幅该特性将不在本系列文章中介绍,该特性的“缺席”不会影响本系列文章内容的理解,我们会在后续其它博文中再进行讨论。
接下来,我们只需在底层数据发生变化时利用 History Trace 机制读取这些 change 并妥善处理即可:
.onReceive(NotificationCenter.default.publisher(for: .NSPersistentStoreRemoteChange).receive(on: DispatchQueue.main)) {
_ in
let mainContext = modelContext
var historyDesc = HistoryDescriptor<DefaultHistoryTransaction>()
historyDesc.predicate