如何在后台执行 SwiftData 操作


文章目录
- 前言
- Core Data 私有队列上下文
- SwiftData 并发支持
- 使用 ModelActor
- 合并上下文更改的问题
- 通过标识符访问模型
- 总结
前言
SwiftData 是一个用于处理数据操作的框架,特别是在 Swift 语言中进行并发操作。本文介绍了如何在后台执行 SwiftData 操作以及与 Core Data 进行比较。
在 Core Data 中,可以使用私有后台队列上下文来执行长时间运行的任务,以避免阻塞主队列。SwiftData 利用了 Swift 的并发特性,通过在 ModelActor 上创建上下文,实现了类似的后台操作。然而,与 Core Data 不同的是,SwiftData 通过编译器强制执行一些规则,如不允许在非主 actor 上访问主 view 上下文。
Core Data 私有队列上下文
在使用 Core Data 时,使用主队列上的视图上下文执行 UI 操作。为了避免阻塞主队列,可以使用私有后台队列上下文执行长时间运行的任务,如解析和导入数据。
必须注意不要在队列之间传递 Core Data 管理的对象。如果需要在线程之间传递对象,可以使用 NSManagedObjectID 来实现。
SwiftData 并发支持
SwiftData 利用了 Swift 的现代并发特性。可以使用在 ModelActor 上创建的上下文来执行后台工作。
与 Core Data 类似,Model 对象和 ModelContext 都不能在 actor 之间传递(它们都不是可发送的)。与 Core Data 不同的是,Swift 编译器强制执行这些规则。例如,在不在主 actor 上时尝试访问主视图上下文将导致错误:

无法在非隔离 actor 实例上引用主 actor 隔离属性 mainContext
使用 ModelActor
一开始,我们需要创建一个自己实现了 ModelActor 协议的 actor。模型 actor 为我们提供了要使用的上下文。ModelExecutor 控制对模型 actor 的访问。
创建 actor 时,可以使用 ModelContainer 创建一个新的上下文,并使用它来创建 DefaultModelExecutor。我的示例代码有一个用于 Country 对象的模型,因此我可以像这样创建一个模型 actor 来执行后台操作:
import SwiftDataactor CountryModelActor: ModelActor {let executor: any ModelExecutorinit(container: ModelContainer) {let context = ModelContext(container)executor = DefaultModelExecutor(context: context)}func doSomething() { ... }
}
注意:
- ModelContainer 是可发送的,因此我们可以安全地将其传递给 actor 的初始化器。
- ModelActor 有 container 和 context 属性,但不需要直接设置它们。
我们在这个 actor 中做的任何工作都可以访问上下文以插入、获取和删除所需的对象。例如,我已经在 actor 中添加了一个方法,该方法获取所有已访问的国家并将 visited 标志重置为 false:
func resetVisited() throws {let fetchDescriptor: FetchDescriptor<Country> =FetchDescriptor(predicate: #Predicate { $0.visited == true }) let countries = try context.fetch(fetchDescriptor)for country in countries {country.visited = false}// 详见下面的注释// try context.save()
}
可能会这样在我的视图代码中使用它:
func resetVisited() {Task {let actor = CountryModelActor(container: container)do {try await actor.resetVisited()} catch {logger.error("resetVisited: \(error.localizedDescription)")}}
}
合并上下文更改的问题
看到许多开发者抱怨在后台上下文上执行的更改不会立即合并到视图上下文中。在当前的测试版中,如果在 actor 中保存上下文(FB12965835),也会遇到相同的问题。
如果不在 actor 中保存上下文(启用了自动保存),则用户界面会立即更新。这是一系列 SwiftData 中的问题之一,希望在测试版结束之前能够得到修复。
通过标识符访问模型
与 Core Data 一样,如果需要在 actor 之间传递模型对象,应使用模型对象的持久标识符:
country.persistentModelID
ModelActor 提供了一个方便的下标,以通过标识符检索模型对象。例如,actor 中的此方法设置了通过标识符传递的一组国家的 visited 标志:
func visit(identifiers: [Country.ID]) {for identifier in identifiers {if let country = self[identifier, as: Country.self] {country.visited = true}}
}
使用下标等效于编写:
if let country = context.model(for: identifier) as? Country { ... }
总结
在操作数据模型时,需要注意不要在不同的 actors 之间传递管理的对象。取而代之的是,可以使用 NSManagedObjectID 来在不同的线程之间传递对象。
此外,文章还提到了一些问题,如在后台上下文上执行的更改可能不会立即合并到主视图上下文中。然而,SwiftData 框架的优势在于利用了 Swift 的现代并发特性,为数据操作提供了更强大的支持,使开发人员能够在处理数据时更加灵活和高效。
相关文章:
如何在后台执行 SwiftData 操作
文章目录 前言Core Data 私有队列上下文SwiftData 并发支持使用 ModelActor合并上下文更改的问题通过标识符访问模型总结 前言 SwiftData 是一个用于处理数据操作的框架,特别是在 Swift 语言中进行并发操作。本文介绍了如何在后台执行 SwiftData 操作以及与 Core D…...
TCP和UPD协议
一)应用层协议简介:根据需求明确要传输的信息,明确要传输的数据格式; 应用层协议:这个协议,实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统,驱动,硬件实现好了的,咱们是不需要管 2)应用层:当我…...
MySQL:锁机制
目录 概述三种层级的锁锁相关的 SQLMyISAM引擎下的锁InnoDB引擎下的锁InnoDB下的表锁和行锁InnoDB下的共享锁和排他锁InnoDB下的意向锁InnoDB下的记录锁,间隙锁,临键锁记录锁(Record Locks)间隙锁(Gap Locks࿰…...
软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】
软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】 课本里章节里所有蓝色字体的思维导图...
【Git】安装和常用命令的使用与讲解及项目搭建和团队开发的出现的问题并且给予解决
目录 Git的简介 介绍 Git的特点及概念 Git与SVN的区别 图解 编辑 命令使用 安装 使用前准备 搭建项目环境 编辑 团队开发 Git的简介 介绍 Git 是一种分布式版本控制系统,是由 Linux 之父 Linus Torvalds 于2005年创建的。Git 的设计目标是为了更好地管…...
Python进行数据可视化,探索和发现数据中的模式和趋势。
文章目录 前言第一步:导入必要的库第二步:加载数据第三步:创建基本图表第四步:添加更多细节第五步:使用Seaborn库创建更复杂的图表关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyth…...
2023年中国自然语言处理行业研究报告
第一章 行业概况 1.1 定义 自然语言处理(Natural Language Processing,简称NLP)是一门交叉学科,它结合了计算机科学、人工智能和语言学的知识,旨在使计算机能够理解、解释和生成人类语言。NLP的核心是构建能够理解和…...
RISC-V与RISC Zero zkVM的关系
1. 引言 本文基本结构为: 编程语言背景介绍RISC-V虚拟机作为zkVM电路为何选择RISC-V? 2. 编程语言背景介绍 高级编程语言不专门针对某个架构,其便于人类编写。高级编程语言代码,经编译器编译后,会生成针对专门某架…...
20行JS代码实现屏幕录制
在开发中可能有遇到过屏幕录制的需求,无论是教学、演示还是游戏录制,都需要通过屏幕录制来记录和分享内容。一般在App内H5页基于客户端能力实现的较多,现在浏览器中的 MediaRecorder 也提供了这种能力。MediaRecorder 是一种强大的技术&#…...
基于springboot实现福聚苑社区团购平台系统项目【项目源码】
基于springboot实现福聚苑社区团购平台系统演示 Javar技术 Java是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&…...
网际报文协议ICMP及ICMP重定向实例详解
目录 1、ICMP的概念 2、ICMP重定向 3、利用ICMP重定向进行攻击的原理 4、如何禁止ICMP重定向功能? 4.1、在Linux系统中禁用 4.2、在Windows系统中禁用 5、关于ICMP重定向的问题实例 VC常用功能开发汇总(专栏文章列表,欢迎订阅…...
前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(三)
知者乐水,仁者乐山。 XMLHttpRequest AJAX原理 - XMLHttpRequest 前面与服务器交互使用的不是axios吗? ajax并不等于axios 我们使用的axios的内部,实际上对XHR对象/原理 的封装 为什么还要学习ajax? ①在一些静态网站项目中…...
Android 12 S 系统开机流程分析 - SetupSelinux(二)
Android 12 S 系统开机流程分析-FirstStageMain(一) 本文接着上文开始讲解,上文中最后一步执行后会执行init启动过程中的第二步SetupSelinux(Selinux配置阶段),这样又会走到main.cpp中的main方法。 目录 1. SetupSelinux 1.1 …...
高速信号PCB布局怎么布?(电子硬件)
对于高速信号,pcb的设计要求会更多,因为高速信号很容易收到其他外在因素的干扰,导致实际设计出来的东西和原本预期的效果相差很多。 所以在高速信号pcb设计中,需要提前考虑好整体的布局布线,良好的布局可以很好的决定布…...
vue 子页面通过暴露属性,实现主页面的某事件的触发
目录 1.前言2.代码2-1 子页面2-2 主页面 1.前言 需求:当我在子页面定义了一个定时器,点击获取验证码,计时器开始倒计时,在这个定时器没有走完,退出关闭子页面,再次进入子页面,定时器此时会被刷…...
计算机丢失mfc140.dll是什么意思?附送修复教程
mfc140.dll是Microsoft Foundation Classes(MFC)库的一部分,是一种动态链接库(DLL)文件。MFC库是Microsoft提供的一种C编程框架,它为开发者提供了许多方便的工具和类,以简化Windows应用程序的开…...
R语言将向量横向转换为单行数据框,随后整合数量不确定的数据框
vector1 c(1, “karthik”, “IT”) names(vector1) c(“id”, “name”, “branch”) df data.frame(as.list(vector1)) print(df) 先给向量的元素命名,然后转换为列表,最后转换为数据框。 我的需求大概是这个样子:数量不确定的仅有单行…...
怎么测试websocket接口
在部分业务中,我们需要使用长连接,我们可以使用http长连接或者websocket,开发结束后难免会遇到测试问题,这里推荐2个,一个是postman,一个是网站 postman 测试网站 测这边推荐测试网站,支持ws/w…...
21 移动网络的前世今生
1、移动网络的发展历程 发展过程就是:2G,3G,4G,5G的过程,用2G看txt,用3G看jpg,用4G看avi。 2、2G网络 手机本来是用来打电话的,不是用来上网的,所以原来在2G时代,上网使用的不是IP网络&#…...
里氏替换原则
定义:子类对象能够替换程序中父类对象出现的任何地方,并且*保证原来程序的逻辑行为不变及正确性不被破坏*。 public class Transporter {private HttpClient httpClient;public Transporter(HttpClient httpClient) {this.httpClient httpClient;}public Response…...
暗黑3终极效率革命:D3KeyHelper智能宏工具完整实战指南
暗黑3终极效率革命:D3KeyHelper智能宏工具完整实战指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中繁琐的技能操作而烦…...
ARIMA模型保存与加载问题解决方案
1. ARIMA模型保存与加载的完整指南在时间序列分析领域,ARIMA(自回归积分滑动平均)模型是最经典且广泛应用的预测工具之一。作为Python数据分析师,我们经常需要将训练好的模型保存下来供后续使用。然而在实际操作中,sta…...
Vue2项目实战:如何基于Element UI封装一个可复用的‘批量排班’日历组件(含完整代码)
Vue2实战:基于Element UI打造高复用排班日历组件 在企业级后台管理系统开发中,排班功能是客服、医疗、制造等行业的共性需求。本文将分享如何基于Vue2和Element UI封装一个支持批量操作、可配置班次类型的日历排班组件,实现跨项目复用。 1. 组…...
STM32 HAL库实战:用I2C+DMA连续读取AS5600角度,解放CPU的保姆级教程
STM32 HAL库实战:I2CDMA连续读取AS5600角度的高效方案 在实时控制系统中,如云台稳定、机器人关节控制等场景,对编码器角度数据的实时采集有着极高的要求。传统轮询方式会大量占用CPU资源,而中断方式在高频率读取时又会产生显著的性…...
别再乱试那个ChatGPT“开发者模式”咒语了,实测无效还可能导致封号
揭秘ChatGPT“开发者模式”真相:安全使用AI的终极指南 最近在各大社交平台和论坛上,流传着一种号称可以“解锁ChatGPT全部潜能”的神秘指令。不少用户抱着好奇或功利的心态尝试这些所谓的“开发者模式咒语”,却不知这背后隐藏着怎样的技术原理…...
D2DX宽屏补丁:5分钟让暗黑破坏神2在现代PC上流畅运行的终极指南
D2DX宽屏补丁:5分钟让暗黑破坏神2在现代PC上流畅运行的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx …...
Android车机开发避坑:CarLauncher与地图Activity同时Resumed?多窗口模式源码解析
Android车机多窗口模式源码解析:为何CarLauncher与地图Activity能同时Resumed? 在车载Android系统开发中,一个看似违反常识的现象经常困扰开发者:当使用WINDOWING_MODE_MULTI_WINDOW模式时,CarLauncher主界面与地图导航…...
2025最权威的五大降重复率平台横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于自然语言处理跟深度学习技术的智能工具,是AI写作软件,它能辅助用…...
保姆级教程:在Abaqus中关闭S4R单元沙漏控制,让仿真结果更准(附Python脚本)
工程实战:Abaqus S4R单元沙漏控制优化与Python自动化解决方案 在结构仿真领域,Abaqus作为行业标杆软件,其S4R单元因其优秀的计算效率和适应性,成为板壳分析的首选。然而,许多工程师在实际应用中常遇到一个棘手问题&…...
避坑指南:Maven父子项目pom.xml配置,如何避免IDE识别成多个独立项目?
Maven多模块项目配置精要:从源头规避IDE识别混乱的工程实践 在Java企业级开发中,Maven多模块项目已经成为管理复杂代码库的标准范式。然而,当你在IntelliJ IDEA中打开精心设计的项目时,是否遇到过这样的场景:项目窗口突…...
