SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

在这里插入图片描述

概览

我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。

在这里插入图片描述

那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在这里来一场钩深索隐、推本溯源的探究之旅吧。

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

  • 概览
  • 1. CoreData 托管对象多个实例的同步问题
  • 2. SwiftData 是否会重蹈覆辙?
  • 3. SwiftData 超简洁的解决方案
  • 总结

相信学完本课后,小伙伴们一定会惊叹在 SwiftData 模型对象多个实例间的同步竟如此之简单,简直不可思议!

无需等待,让我们马上开始同步大冒险吧!Let’s go!!!😉


1. CoreData 托管对象多个实例的同步问题

我们知道为了和 SwiftUI “亲密无间”,何曾几时(iOS 13.0+) CoreData 的托管类 NSManagedObject 也悄然遵守了 ObservableObject 协议。

在这里插入图片描述

从那一刻起,CoreData 托管对象便可以乖巧的作为 SwiftUI 视图中的状态“乐此不疲”。

在这里插入图片描述

不过,在 SwiftUI 视图 @FetchRequest 查询结果 FetchedResults 中的托管对象若在外部被修改,则该查询结果并不会自动进行同步:

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Cave.name, ascending: false)], predicate: NSPredicate(format: "challenge.stateValue = \(ChallengeState.inProgress.rawValue)"), animation: .bouncy) var inProcessingCaves: FetchedResults<Cave>

拿上面的 inProcessingCaves 状态来说,它包括了所有正在“进行中”的 Cave 托管对象(用 NSPredicate 来过滤数据),这些对象都会显示在主视图顶部“正在进行”的 Section 里:

在这里插入图片描述

如果我们在子视图里将 inProcessingCaves 中的任何对象状态由“进行中”改成了“已失败”,那么它们理应从“正在进行”的 Section 中“销声匿迹”,但实际情况却事与愿违:

在这里插入图片描述

如上图所示:红色的“已失败”Cave 托管对象仍在“厚颜无耻”的占据着“正在进行” Section 中的宝贵空间。


关于上面 CoreData 中 @FetchRequest 托管对象的过滤结果不能被及时刷新的解决之道,我们将会在后续博文中详述,小伙伴们敬请期待吧!


那么这种情况在最新的 SwiftData 中还会存在吗?让我们探寻一番吧。

2. SwiftData 是否会重蹈覆辙?

SwiftData 是苹果在 WWDC 23 推出的完全符合 Swift 范儿的数据库框架,其描述性的语法非常适合托管表本身、表字段以及表间关系的构建。


更多 SwiftData 相关内容的介绍,请小伙伴们尽情观赏如下链接中的精彩内容:

  • iOS 18 中全新 SwiftData 重装升级,其中一个功能保证你们“爱不释手”
  • SwiftData(iOS 17+)如何在数据新建和更新中途出错时恢复如初?
  • 『第十二章』数据持久化:SwiftData

为了模拟 CoreData 中的数据结构,我们分别创建了两个 SwiftData 数据模型:Item 和 SubItem,其中每个 Item 都至多包含一个 SubItem。

import SwiftData@Model
final class Item {@Attribute(.unique) var id: UUIDvar timestamp: Datevar name: String@Relationshipvar subItem: SubItem?init(timestamp: Date, name: String) {self.timestamp = timestampself.name = nameid = UUID()}static var sampleItems: [Item] = {var items = [Item]()let names = ["Apple", "Jujube", "Watermelon"]for name in names {let new = Item(timestamp: Date.now, name: name)let newSub = SubItem(timestamp: Date.now, name: "Sub \(name)", state: .unstarted)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42280.shtml

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

相关文章

RK3588编译rkmpp,拉取海康威视网络摄像头264码流并运行yolo

硬件&#xff1a;EVB评估版 SOC&#xff1a;Rockchip RK3588 背景&#xff1a; 由于项目需要&#xff0c;需要拉取264码流&#xff0c;并通过将yolov5s.pt将模型转化为rknn模型&#xff0c;获取模型分析结果。取流可以通过软件解码或者硬件解码&#xff0c;硬件解码速度更快&…

Java版Flink使用指南——安装Flink和使用IntelliJ制作任务包

大纲 安装Flink操作系统安装JDK安装Flink修改配置启动Flink测试 使用IntelliJ制作任务包新建工程Archetype 编写测试代码打包测试 参考资料 在《0基础学习PyFlink》专题中&#xff0c;我们熟悉了Flink的相关知识以及Python编码方案。这个系列我们将使用相对主流的Java语言&…

LabVIEW在自动化测试项目中的推荐架构

在自动化测试项目中&#xff0c;推荐使用LabVIEW的生产者-消费者&#xff08;Producer-Consumer&#xff09;架构。这种架构利用队列实现数据的异步传输和处理&#xff0c;提供了高效、稳定和可扩展的解决方案。其主要优点包括&#xff1a;实现数据采集与处理的解耦、提高系统响…

中国IDC圈探访北京•光子1号金融算力中心

今天&#xff0c;“AI”、“大模型”是最炙手可热的话题&#xff0c;全球有海量人群在工作生活中使用大模型&#xff0c;大模型产品涉及多模态&#xff0c;应用范围已涵盖电商、传媒、金融、短视频、制造等众多行业。 而回看2003年的互联网记忆&#xff0c; “上网”“在线”是…

【C语言】C语言可以做什么?

C语言作为一种高效、灵活且具有底层控制能力的编程语言&#xff0c;在软件开发的多个领域中得到了广泛应用。以下是C语言在主要应用领域中的总结&#xff1a; 1. 操作系统开发 1.1 操作系统内核 C语言因其高效性和底层硬件控制能力&#xff0c;被广泛用于编写操作系统内核。…

【LVGL-SquareLine Studio】

LVGL-SquareLine Studio ■ SquareLine Studio-官网下载地址■ SquareLine Studio-参考博客■ SquareLine Studio-安装■ SquareLine Studio-汉化■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio- ■ SquareLine S…

C++基础(十一):STL简介

从今天开始&#xff0c;我们正式步入STL的学习&#xff0c;STL&#xff08;标准模板库&#xff0c;Standard Template Library&#xff09;是C标准库的重要组成部分&#xff0c;提供了一系列通用的类和函数模板&#xff0c;包括容器、算法、迭代器等。它的设计极大地提高了代码…

[leetcode hot 150]第一百三十题,被围绕的区域

题目&#xff1a; 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O 组成&#xff0c;捕获 所有 被围绕的区域&#xff1a; 连接&#xff1a;一个单元格与水平或垂直方向上相邻的单元格连接。区域&#xff1a;连接所有 0 的单元格来形成一个区域。围绕&#xff1a…

linux,docker,k8s常见命令

Linux 日志被删除查询日志 找到进程jps cd/proc/{pid}/fd su admin ls -lh|grep 文件名 在日期前的为id 然后tail -f id 后台运行 nohup & 删除文件 rm -f /opt/kibana-7.6.0-linux-x86_64.tar.gz 删除文件夹 rm -rf /opt/kibana-7.6.0-linux-x86_64 复制文件…

C++第一弹 -- C++基础语法上(命名空间 输入输出 缺省参数 函数重载 引用)

目录 前言一. C关键字(C98)二. 命名空间1.命名空间的定义2.命名空间的使用3.其它部分 三. C输入&输出四. 缺省参数1. 缺省参数的概念2.缺省参数的分类 五. 函数重载1.函数重载的概念2. 为什么C支持函数重载, 而C语言不支持重载呢? 六. 引用1.引用的概念2.引用的特性3.常引…

通过AIS实现船舶追踪与照射

前些天突然接到个紧急的项目&#xff1a;某处需要实现对夜航船只进行追踪并用激光灯照射以保障夜航安全。这个项目紧急到什么程度呢&#xff1f;&#xff01;现场激光灯都安装好了&#xff0c;还有三个星期就要验收了&#xff0c;但上家没搞定就甩给我们了:( 从技术上看&#…

mysql5.6写定时备份脚本

文章目录 设置脚本创建备份脚本配置执行权限配置定时任务打开crontab编辑器配置定时任务和执行脚本 查看路径下备份出来的数据内容20240706130701_test.sql文件内容 设置脚本 创建备份脚本 #!/bin/bash# 定义数据库连接参数 DB_USER"root" DB_PASSWORD"root&q…

Java应用系统设计与实现--学生信息管理系统(附解决方案源码)

一、实验目的及要求 1.1实验目的 掌握Java GUI编程技术&#xff0c;了解Swing框架的使用。 掌握MySQL数据库的基本操作&#xff0c;了解如何在Java中连接和操作数据库。 掌握用户权限管理的基本概念和实现方法。 提升综合运用所学知识设计和实现一个完整应用系统的能力…

windows机器免密登录linux主机

1. 正常连接需要输入密码 ssh root1.1.1.1 2. 在Windows上生成SSH密钥对&#xff08;如果你还没有的话&#xff09;&#xff1a; ssh-keygen 3. scp将id_rsa.pub传输到对应的主机 4.对应机器上查看 5.从windows上免密登录

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关&#xff0c;实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力&#xff0c;并提供了详细的代码示例和 Mermaid 生成的图表&#xff0c;助您轻松构建自己的蓝牙网关解…

树(相关知识点)

目录 结点的度&#xff1a;某一个结点所含有字数的个数 叶节点&#xff1a;最后一个结点 非终端节点:不是叶结点 兄弟结点&#xff1a;亲兄弟结点 树的度&#xff1a;最大节点的度 层次&#xff1a;根为第一层&#xff0c;根的子结点为第二层&#xff0c;以此类推 森林&am…

Spring Boot与Okta的集成

Spring Boot与Okta的集成 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中集成Okta&#xff0c;实现身份认证和授权的功能…

Sass 和 SCSS

Sass 和 SCSS 是 Sass (Syntactically Awesome Stylesheets) 的两种语法。它们都被用于编写更加结构化和易于维护的 CSS。以下是它们在语法和特性上的主要对比&#xff1a; 1. 语法格式 Sass (缩进语法) 没有花括号 {} 和分号 ;。使用缩进来表示嵌套和层次关系。 navulmarg…

微软拼音输入法不显示选字框问题

问题展示&#xff1a;不显示选字框 解决方式 打开兼容性即可&#xff08;估计是升级带来的bug&#xff09;

探索参数化配置与系统性能的平衡点

在现代软件开发中&#xff0c;参数化配置已成为提高系统可扩展性和灵活性的关键方法之一。通过参数化配置&#xff0c;开发人员可以在不修改代码的情况下轻松调整系统行为&#xff0c;以适应不同的运行环境和需求。然而&#xff0c;尽管参数化配置带来了显著的好处&#xff0c;…