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

news2024/11/13 11:14:34

在这里插入图片描述

概述

在 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 = modelContext
        var historyDesc = HistoryDescriptor<DefaultHistoryTransaction>()
        historyDesc.predicate = #Predicate {
    trans in
            trans.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.coloradmin.cn/o/2127905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形&#xff08;可能是旋转的&#xff09;。开发者…

arm64-v8a 和 armeabi-v7a、armeabi 有什么区别

有时下载软件包有好几种选择&#xff0c;包括 arm64-v8a、armeabi-v7a、armeabi、x86_64 等。如果不清楚它们的含义&#xff0c;随便选择下载可能导致软件不能安装。以下是相关知识介绍。 从这些命名大概可以猜出它与 32 位或 64 位软件有关&#xff0c;部分确实可以这样理解&…

Java 每日一刊(第4期):Java 23 即将发布

文章目录 前言Java 23 即将发布&#xff0c;迎接新的功能时代JDK 24 的早期访问版本&#xff1a;Project Loom 的进展JConf.dev 大会&#xff1a;Java 社区的重要盛会本期小知识 创新不是逻辑思维的产物&#xff0c;而是富有远见的心灵创造。 前言 这里是分享 Java 相关内容的…

SprinBoot+Vue山西文旅网的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

使用智能机器人外呼,助力升级企业客户联络

现如今企业与客户之间的沟通方式正在经历着深刻的变革&#xff0c;智能机器人外呼技术以其高效、精准、成本低等优势&#xff0c;逐渐成为企业进行客户联系和市场推广的重要工具。本文将详细探讨智能机器人外呼的定义、应用及其对企业的重大影响&#xff0c;以及如何通过这一技…

稀土紫外屏蔽剂:防晒护肤品

稀土紫外屏蔽剂在防晒护肤用品领域的应用越来越受到关注。稀土紫外屏蔽剂主要利用稀土元素的特殊光学特性来阻挡或吸收紫外线&#xff0c;从而保护皮肤免受紫外线伤害。以下是稀土紫外屏蔽剂在防晒护肤用品中的主要优势和作用&#xff1a; 高效紫外线吸收&#xff1a;稀土元素如…

TDengine 首席架构师肖波演讲整理:探索新型电力系统的五大关键场景与挑战

在 7 月 26 日的 TDengine 用户大会上&#xff0c;涛思数据&#xff08;TDengine&#xff09;首席架构师肖波进行了题为《TDengine 助力新型电力系统高质量发展》的主题演讲。他不仅分享了 TDengine 在新型电力系统中的应用案例&#xff0c;还深入探讨了如何利用 TDengine 的高…

SprinBoot+Vue便民医疗服务微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

前端面试记录

第一家&#xff08;架构项目&#xff09;&#xff1a; 1.vueRouter原理 2.单页面spa与多页面mpa区别 3.hash和history区别 4.webpack打包流程 5.npm安装依赖过程 6.热更新原理 第二家(机试项目)&#xff1a; 1&#xff0e;组件继承原组件方法 a t t r s , attrs, attrs,lis…

828华为云征文 | 云服务器Flexus X实例,搭建个人博客网站WordPress

828华为云征文 | 云服务器Flexus X实例&#xff0c;搭建个人博客网站WordPress 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、登录宝塔面板-下载软件并配置对应版本 Nginx 1.24.0MySQL 5.7.44PHP 5.6.40Pure Ftpd 1.0.49phpMyAdmin 4.9 3、软…

UE5源码Windows编译、运行

官方文档 Welcome To Unreal Engine 5 Early Access Learn what to expect from the UE5 Early Access program. 链接如下&#xff1a;https://docs.unrealengine.com/5.0/en-US/Welcome/#gettingue5earlyaccessfromgithub Step 0&#xff1a;找到UE5源码 直接先上链接 https…

【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现 本文将详细介绍如何使用容器适…

网络安全(sql注入,初步认识)

这里写目录标题 一. information_schema.tables 和 information_schema.schemata是information_schema数据库中的两张表1. information_schema.schemata2. information_schema.tables 二. 判断注入类型1. 判断数字型还是字符型注入2. 判断注入闭合是""还是 三. 判断表…

Java Jdbc 链接db2数据库示例

pom.xml 各版本 <dependency><groupId>com.ibm.db2</groupId><artifactId>jcc</artifactId><version>11.5.9.0</version> </dependency>java 示例 package com.iRain93.test;import java.sql.Connection; import java.sql.Dr…

JAVAJDBC连接ORACLE数据库

1.选择的驱动版本&#xff08;jdk1.8oracle11G&#xff09; 2.获取驱动到本地 3.将驱动配置到maven 如果配置了环境变量命令操作符执行即可。 未配置环境变量需要在maven的bin目录下 mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc8 -Dversion12.2.0.1 -D…

【人工智能学习笔记】4_1 深度学习基础之深度学习概述

深度学习概述 深度学习(Deep Learning, DL) 是机器学习的分支是一种以人工神经网络为架构,对资料进行表征的学习的算法表征学习(特征学习) :将原始数据转换成为能够被机器学习有效开发的一种技术的集合优缺点 优点 学习能力强覆盖范围广、适应性好数据驱动、上限高可移…

python-古籍翻译

题目描述 小理跑到外星人的图书馆去读书。有一本外星古籍&#xff0c;里面的内容是用八进制写成的&#xff1b;但小理只能处理十六进制的数据。请你帮忙写一个翻译软件&#xff0c;帮小理把八进制串翻译成十六进制串。 输入 仅一行&#xff0c;一个八进制字符串 s&#xff0…

Mac笔记本上查看/user/目录下的文件的几种方法

在Mac笔记本上查看/user/下的文件&#xff0c;可以通过多种方法实现。以下是一些常见的方法&#xff1a; 一、使用Finder 打开Finder&#xff1a;点击Dock栏中的Finder图标&#xff0c;或者使用快捷键Command F。 导航到用户目录&#xff1a; 在Finder的菜单栏中&#xff0…

下一代RAG:MemoRAG

MemoRAG是一个建立在高效、超长记忆模型之上的创新 RAG&#xff08;Retrieval-Augmented Generation&#xff09;框架&#xff0c;由智源研究院&#xff08;北京人工智能研究院&#xff09;与中国人民大学高瓴人工智能学院联合推出并开源。 MemoRAG&#xff1a;通过记忆启发的…

计算机视觉的应用33-基于双向LSTM和注意力机制融合模型的车辆轨迹预测应用实战

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用33-基于双向LSTM和注意力机制融合模型的车辆轨迹预测应用实战。在当今复杂的数据处理场景中&#xff0c;尤其是面对时间序列或序列数据时&#xff0c;双向 LSTM结合注意力机制的模型因其强大的序列…