当前位置: 首页 > news >正文

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

在这里插入图片描述

概述

在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0 版本。其新加入的历史记录追踪(History Trace)机制着实让秃头码农们“如痴如醉”了一番。

在这里插入图片描述

我们在之前的博文中已经介绍了 History Trace 是如何处理数据新增操作的。而在这里,我们将再接再厉来完成数据删除时的全盘考量。

在本篇博文中,您将学到如下内容:

  • 概述
  • 9. SwiftData 对于托管对象删除的稳妥处理
  • 总结

这是本系列第五篇博文。闲言少叙,让我们马上开始 SwiftData 精彩的探究之旅吧!

Let‘s dive in!!!😉


9. SwiftData 对于托管对象删除的稳妥处理

在之前的博文中,我们讨论过如何利用历史记录追踪机制(History Trace)来处理后台线程中记录的插入操作。

我们已然知晓:History Trace 可以监听 3 种类型的数据改变:新增、更新和删除。

其中更新和新增的情况比较类似,我们不再赘述。

这里,让我们“集中火力”来聊聊 History Trace 中关于记录删除时的处理。

当托管对象从 SwiftData 持久数据库中删除时,我们仍然可以通过其实例中的 persistentModelID 来“招魂”。但是,对它任意字段的所有访问将会立即导致应用崩溃。

在这里插入图片描述

为了能让大家体会到这种情况,我们将之前 ContentView 视图的代码略作如下修改:

struct ContentView: View {@Environment(\.modelContext) var modelContext@Query var items: [Item]private func handleChangeInMainContext() {let mainContext = modelContextvar historyDesc = HistoryDescriptor<DefaultHistoryTransaction>()historyDesc.predicate = #Predicate { trans intrans.author == "BG"}let transactions = try! mainContext.fetchHistory(historyDesc)for trans in transactions {for change in trans.changes {// 在删除后,下面这个 changedItem 其实已是“尸体”💀guard let changedItem = mainContext.model(for: change.changedPersistentIdentifier) as? Item else { continue }// 试图访问已删除对象中任何字段的内容都会导致崩溃switch change {case .insert(_)

http://www.mrgr.cn/news/25180.html

相关文章:

  • 手把手教你安装pytorch包
  • 多线程和高并发-17题
  • 企业如何“向内求”, 挖出更多净利润?
  • 电脑文件怎么加密?文件加密方法介绍
  • LVDS眼图eys diagram测试
  • 核心系统用PG了,抠脑壳的权限,搞晕了!
  • 数据分布:散点+箱线+小提琴 三图合一
  • 公开数据库汇总及下载3-遗传变异数据库(ClinVar、dbVar、dbSNP、RefSeq)、oncoKB
  • 价值流:从理论框架到实践落地的系统化指南
  • 【Linux】Linux常见指令以及权限理解(下)
  • 路径规划 | 基于A*算法的往返式全覆盖路径规划的改进算法(Matlab)
  • 峟思-振弦式应变计在煤矿井筒中的应用
  • 《2024-2029年全球及中国交通安全移动护栏市场现状分析与发展前景预测研究报告》
  • 股指期货开户条件有什么要求和流程?
  • 【JAVA入门】Day39 - 字符集
  • 初识Linux · 进程(1)
  • 华媒舍:10种提升推特大V发文推广曝光率的方式
  • 零基础考过软考信息系统项目管理师经验分享
  • 正版软件 | Sticky Password 终身密码管理器 - 使用教程分享
  • 最好磁吸充电宝是哪个牌子?目前公认好用磁吸充电宝排行榜!