如何在后台执行 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 SwiftData

actor CountryModelActor: ModelActor {
  let executor: any ModelExecutor
    
  init(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 的现代并发特性,为数据操作提供了更强大的支持,使开发人员能够在处理数据时更加灵活和高效。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

频谱分析仪 如何选择 TFN RMT系列给您答案

TFN RMT手持式频谱分析仪是TFN新推出的一款高性能、全功能版测试仪&#xff0c;集高性能信号分析模块、多制式解析算法软件于一体的手持式测试仪表&#xff0c;满足军工、高校科研、通信运营商、电力、铁路等对移动通信的测试、无线排查干扰等应用而全新推出的平台&#xff0c;…

Linux系统编程——文件的写入及读取

写入(write) 使用write函数需要包含以下头文件&#xff1a; #include <unistd.h> write的函数定义格式 ssize_t write(int fd, const void *buf, size_t count); 附加&#xff1a;一般将数据写入文件中后需关闭文件&#xff0c;这里需要调用关闭(close)函数&#xf…

高级运维学习(十五)Zabbix监控(二)

一 Zabbix 报警机制 1 基本概念 自定义的监控项默认不会自动报警首页也不会提示错误需要配置触发器与报警动作才可以自动报警 2 概念介绍 &#xff08;1&#xff09;触发器 (trigger) 表达式&#xff0c;如内存不足300M&#xff0c;用户超过30个等 当触发条件发生后&a…

[unity]多脚本情况下update函数的执行顺序

序 有的时候&#xff0c;执行某些脚本时会有先后顺序的要求。unity是按什么顺序来执行脚本的&#xff1f;如何设置&#xff1f; 默认的执行顺序 官方文档里面有个很长的图&#xff1a; Unity - Manual: Order of execution for event functions (unity3d.com) 根据文档&…

传输层中的TCP和UPD协议

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

YOLOv8-Seg改进: 分割小目标系列篇 | SPD-Conv,提升分割小目标和弱小分割图精度

🚀🚀🚀本文改进:SPD-Conv由一个空间到深度(SPD)层和一个无卷积步长(Conv)层组成,可以应用于大多数CNN体系结构,特别是在处理低分辨率图像和分割小目标等更困难的任务时。 🚀🚀🚀SPD-Conv 分割小目标检测首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http:…

【修车案例】一波形一案例(9)

故障车型&#xff1a;捷豹X-Type 故障现象&#xff1a;发动机故障指示灯点亮&#xff0c;加速时动力不足&#xff0c;扫描工具显示EGR阀和涡轮增压器增压控制位置传感器电路故障 示波器诊断&#xff1a;检测增压控制位置传感器电路的完整性 A通道 - 增压控制执行电机电源电压B通…

docker更改存储目录原因及方案

为什么一定要将docker的存储目录挂载到其他目录 docker在安装时默认存储目录在/var/lib/docker&#xff0c;而该目录是在系统盘下的。docker安装后&#xff0c;会使用各种各样的镜像&#xff0c;动辄几个G&#xff0c;那么如此多的镜像文件&#xff0c;装着装着系统盘就撑爆了…

chrome安装Vue Devtools插件以及无法添加来自此网站的应用问题

chrome安装Vue Devtools插件以及无法添加来自此网站的应用问题 问题背景 Chrome Vue插件是一款可以帮助前端开发人员在浏览器中实时查看和编辑Vue组件和数据的工具。给前端开发人员提供了极大的便利。本文将介绍Chrome浏览器中如何安装Devtools插件。 问题分析 &#xff08…

第五章:人工智能深度学习教程-人工神经网络(第一节-人工神经网络及其应用)

当您阅读这篇文章时&#xff0c;您体内的哪个器官正在思考这个问题&#xff1f;当然是大脑啦&#xff01;但你知道大脑是如何运作的吗&#xff1f;嗯&#xff0c;它有神经元或神经细胞&#xff0c;它们是大脑和神经系统的主要单位。这些神经元接收来自外界的感觉输入并进行处理…

Elastic Stack 8.11:引入一种新的强大查询语言 ES|QL

作者&#xff1a;Tyler Perkins, Ninoslav Miskovic, Gilad Gal, Teresa Soler, Shani Sagiv, Jason Burns Elastic Stack 8.11 引入了数据流生命周期、一种配置数据流保留和降采样&#xff08;downsampling&#xff09; 的简单方法&#xff08;技术预览版&#xff09;&#xf…

Milvus Cloud——什么是 Agent?

什么是 Agent? 根据 OpenAI 科学家 Lilian Weng 的一张 Agent 示意图 [1] 我们可以了解 Agent 由一些组件来组成。 规划模块 子目标分解:Agent 将目标分为更小的、易于管理的子目标,从而更高效地处理复杂的任务。 反省和调整:Agent 可以对过去的行为进行自我批评和自我反思…

【深度学习】机器翻译的前世今生

我们都知道谷歌翻译&#xff0c;这个网站可以像变魔术一样在100 种不同的人类语言之间进行翻译。它甚至可以在我们的手机和智能手表上使用&#xff1a; 谷歌翻译背后的技术被称为机器翻译。它的出现改变了世界交流方式。 事实证明&#xff0c;在过去几年中&#xff0c;深度学习…

【JVM】类加载器 Bootstrap、Extension、Application、User Define

以下环境为 jdk1.8 两大类 分类成员语言继承关系引导类加载器bootstrap 引导类加载器C/C无自定义类加载器extension 拓展类加载器、application 系统/应用类加载器、user define 用户自定义类加载器Java继承于 java.lang.ClassLoader 四小类 Bootstrap 引导类加载器 负责加…

工业自动化与5G技术的融合:开启工业4.0时代的新篇章

工业自动化与5G技术的融合&#xff1a;开启工业4.0时代的新篇章 随着全球数字化进程的加速推进&#xff0c;工业自动化作为现代制造业的核心驱动力&#xff0c;正经历着前所未有的变革。而在这一变革中&#xff0c;5G技术的崛起为工业自动化带来了全新的可能性和机遇。本文将探…

Power Automate-时间戳转化为时区时间

点击编辑 在两个步骤之间再插入一个新步骤&#xff0c;添加操作 在内置里点击日期时间 点击转换时区 下面再修改为已转换的时间

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速&#xff0c;人像采集在金融机构身份认证领域中发挥重要作用&#xff0c;为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面&#xff1a; 身份盗用和欺诈风险&#xff1a;传统身份验证方式可能存在漏洞&am…

MemcachedRedis构建缓存服务器 (主从,持久化,哨兵)

许多Web应用都将数据保存到 RDBMS中&#xff0c;应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中&#xff0c;就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询…

js基础之对象

目录 一、对象定义 二、声明对象&#xff1a;object 三、对象的操作 四、遍历对象 五、渲染表格案例 六、Math内置对象 七、随机函数 八、日期对象 封装时间函数 封装倒计时函数 九、案例 随机⽣成颜⾊的案例 随机点名 一、对象定义 对象 &#xff1a; 对象…