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

如何在后台执行 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 是一个用于处理数据操作的框架&#xff0c;特别是在 Swift 语言中进行并发操作。本文介绍了如何在后台执行 SwiftData 操作以及与 Core D…...

TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…...

MySQL:锁机制

目录 概述三种层级的锁锁相关的 SQLMyISAM引擎下的锁InnoDB引擎下的锁InnoDB下的表锁和行锁InnoDB下的共享锁和排他锁InnoDB下的意向锁InnoDB下的记录锁&#xff0c;间隙锁&#xff0c;临键锁记录锁&#xff08;Record Locks&#xff09;间隙锁&#xff08;Gap Locks&#xff0…...

​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第1章-绪论-思维导图】 课本里章节里所有蓝色字体的思维导图...

【Git】安装和常用命令的使用与讲解及项目搭建和团队开发的出现的问题并且给予解决

目录 Git的简介 介绍 Git的特点及概念 Git与SVN的区别 图解 ​编辑 命令使用 安装 使用前准备 搭建项目环境 ​编辑 团队开发 Git的简介 介绍 Git 是一种分布式版本控制系统&#xff0c;是由 Linux 之父 Linus Torvalds 于2005年创建的。Git 的设计目标是为了更好地管…...

Python进行数据可视化,探索和发现数据中的模式和趋势。

文章目录 前言第一步&#xff1a;导入必要的库第二步&#xff1a;加载数据第三步&#xff1a;创建基本图表第四步&#xff1a;添加更多细节第五步&#xff1a;使用Seaborn库创建更复杂的图表关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyth…...

2023年中国自然语言处理行业研究报告

第一章 行业概况 1.1 定义 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是一门交叉学科&#xff0c;它结合了计算机科学、人工智能和语言学的知识&#xff0c;旨在使计算机能够理解、解释和生成人类语言。NLP的核心是构建能够理解和…...

RISC-V与RISC Zero zkVM的关系

1. 引言 本文基本结构为&#xff1a; 编程语言背景介绍RISC-V虚拟机作为zkVM电路为何选择RISC-V&#xff1f; 2. 编程语言背景介绍 高级编程语言不专门针对某个架构&#xff0c;其便于人类编写。高级编程语言代码&#xff0c;经编译器编译后&#xff0c;会生成针对专门某架…...

20行JS代码实现屏幕录制

在开发中可能有遇到过屏幕录制的需求&#xff0c;无论是教学、演示还是游戏录制&#xff0c;都需要通过屏幕录制来记录和分享内容。一般在App内H5页基于客户端能力实现的较多&#xff0c;现在浏览器中的 MediaRecorder 也提供了这种能力。MediaRecorder 是一种强大的技术&#…...

基于springboot实现福聚苑社区团购平台系统项目【项目源码】

基于springboot实现福聚苑社区团购平台系统演示 Javar技术 Java是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&…...

网际报文协议ICMP及ICMP重定向实例详解

目录 1、ICMP的概念 2、ICMP重定向 3、利用ICMP重定向进行攻击的原理 4、如何禁止ICMP重定向功能&#xff1f; 4.1、在Linux系统中禁用 4.2、在Windows系统中禁用 5、关于ICMP重定向的问题实例 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xf…...

前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(三)

知者乐水&#xff0c;仁者乐山。 XMLHttpRequest AJAX原理 - XMLHttpRequest 前面与服务器交互使用的不是axios吗&#xff1f; ajax并不等于axios 我们使用的axios的内部&#xff0c;实际上对XHR对象/原理 的封装 为什么还要学习ajax&#xff1f; ①在一些静态网站项目中…...

Android 12 S 系统开机流程分析 - SetupSelinux(二)

Android 12 S 系统开机流程分析-FirstStageMain&#xff08;一&#xff09; 本文接着上文开始讲解&#xff0c;上文中最后一步执行后会执行init启动过程中的第二步SetupSelinux(Selinux配置阶段)&#xff0c;这样又会走到main.cpp中的main方法。 目录 1. SetupSelinux 1.1 …...

高速信号PCB布局怎么布?(电子硬件)

对于高速信号&#xff0c;pcb的设计要求会更多&#xff0c;因为高速信号很容易收到其他外在因素的干扰&#xff0c;导致实际设计出来的东西和原本预期的效果相差很多。 所以在高速信号pcb设计中&#xff0c;需要提前考虑好整体的布局布线&#xff0c;良好的布局可以很好的决定布…...

vue 子页面通过暴露属性,实现主页面的某事件的触发

目录 1.前言2.代码2-1 子页面2-2 主页面 1.前言 需求&#xff1a;当我在子页面定义了一个定时器&#xff0c;点击获取验证码&#xff0c;计时器开始倒计时&#xff0c;在这个定时器没有走完&#xff0c;退出关闭子页面&#xff0c;再次进入子页面&#xff0c;定时器此时会被刷…...

计算机丢失mfc140.dll是什么意思?附送修复教程

mfc140.dll是Microsoft Foundation Classes&#xff08;MFC&#xff09;库的一部分&#xff0c;是一种动态链接库&#xff08;DLL&#xff09;文件。MFC库是Microsoft提供的一种C编程框架&#xff0c;它为开发者提供了许多方便的工具和类&#xff0c;以简化Windows应用程序的开…...

R语言将向量横向转换为单行数据框,随后整合数量不确定的数据框

vector1 c(1, “karthik”, “IT”) names(vector1) c(“id”, “name”, “branch”) df data.frame(as.list(vector1)) print(df) 先给向量的元素命名&#xff0c;然后转换为列表&#xff0c;最后转换为数据框。 我的需求大概是这个样子&#xff1a;数量不确定的仅有单行…...

​怎么测试websocket接口

在部分业务中&#xff0c;我们需要使用长连接&#xff0c;我们可以使用http长连接或者websocket&#xff0c;开发结束后难免会遇到测试问题&#xff0c;这里推荐2个&#xff0c;一个是postman&#xff0c;一个是网站 postman 测试网站 测这边推荐测试网站&#xff0c;支持ws/w…...

21 移动网络的前世今生

1、移动网络的发展历程 发展过程就是&#xff1a;2G,3G,4G,5G的过程&#xff0c;用2G看txt&#xff0c;用3G看jpg&#xff0c;用4G看avi。 2、2G网络 手机本来是用来打电话的&#xff0c;不是用来上网的&#xff0c;所以原来在2G时代&#xff0c;上网使用的不是IP网络&#…...

里氏替换原则

定义:子类对象能够替换程序中父类对象出现的任何地方&#xff0c;并且*保证原来程序的逻辑行为不变及正确性不被破坏*。 public class Transporter {private HttpClient httpClient;public Transporter(HttpClient httpClient) {this.httpClient httpClient;}public Response…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...