欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(四)

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(四)

2025/9/20 9:10:05 来源:https://blog.csdn.net/mydo/article/details/141756489  浏览:    关键词:由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(四)

在这里插入图片描述

概述

在 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)) { _ inlet mainContext = modelContextvar historyDesc = HistoryDescriptor<DefaultHistoryTransaction>()historyDesc.predicate 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词