Swift 使用 Combine 管道和线程进行开发 从入门到精通八

Combine 系列

  1. Swift Combine 从入门到精通一
  2. Swift Combine 发布者订阅者操作者 从入门到精通二
  3. Swift Combine 管道 从入门到精通三
  4. Swift Combine 发布者publisher的生命周期 从入门到精通四
  5. Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
  6. Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
  7. Swift 使用 Combine 进行开发 从入门到精通七
    在这里插入图片描述

1. 管道和线程

Combine 不是一个单线程的结构。 操作符和发布者可以在不同的调度队列或 runloops 中运行。 构建的管道可以在单个队列中,也可以跨多个队列或线程传输数据。

Combine 允许发布者指定线程调度器,不论是从上游的发布者(操作符)接收数据或者向下游的订阅者发送数据,都使用它调度到指定线程。 在与更新 UI 元素的订阅者配合使用时,这一点至关重要,因为更新 UI 始终应该在主线程上。

例如,你可能在代码中看到这样的操作符:

.receive(on: RunLoop.main)

许多操作符可以修改用于进行相关处理的线程或队列。 receive 和 subscribe 是最常见的两个,它们分别负责把调用操作符之后和之前的执行代码调度到对应的线程。

许多其他操作符的参数也包括调度器。 例如 delay, debounce, 和 throttle. 这些也会对执行代码的队列产生影响 - 无论是对自己,还是对于后续在管道中执行的任何操作符。 这些操作符都使用 scheduler 参数,来切换到相应的线程或队列以完成工作。 任何后面连接着他们的操作符也会在其调度器上被调用,从而产生一些影响,如 receive。

2. 把 Combine 运用到你的开发中

通常有两种途径使用 Combine 来进行开发:

  • 首先,简单的使用是把你闭包中的同步调用改成一个操作符。 最普遍的两个操作符是 map 和 tryMap,后者是当你的代码需要抛出错误时使用。

  • 第二是集成你自己的代码,即提供完成回调的异步代码或 API。 如果你集成的代码是异步的,则大概无法在闭合内轻松地使用它。 你需要将异步代码包装成一个 Combine 操作符可以配合和调用的结构。 在实践中,这通常意味着需要创建一个发布者的实例,然后在管道中使用它。

Future 发布者是专门用来支持这类集成的, 在模式 用 Future 来封装异步请求以创建一次性的发布者 中有一个这样的示例。

如果你想使用发布者提供的数据作为创建此发布者的参数或输入,则有两种通用的方法可以这么做:

  1. 使用 flatMap 操作符, 使用传入的数据创建或返回发布者实例。 这是模式 使用 flatMap 和 catch 在不取消管道的情况下处理错误 的一种变体。

  2. 或者,map 或 tryMap 可被用做创建发布者实例,紧跟 switchToLatest 链将该发布者解析为将在管道内传递的值。

级联多个 UI 更新,包括网络请求 和 通过用户输入更新声明式 UI 模式说明了这种使用方法。

你可能会发现创建返回发布者的对象是值得的。 这通常使你的代码能够封装与远程或基于网络的 API 通信的详细信息。 可以使用 URLSession.dataTaskPublisher 或你自己的代码进行开发。 在模式 级联多个 UI 更新,包括网络请求 中详细介绍了这方面的一个简单的示例。

参考

https://heckj.github.io/swiftui-notes/index_zh-CN.html

代码

https://github.com/heckj/swiftui-notes

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

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

相关文章

《MySQL 简易速速上手小册》第5章:高可用性和灾难恢复(2024 最新版)

文章目录 5.1 构建高可用性 MySQL 解决方案5.1.1 基础知识5.1.2 重点案例:使用 Python 构建高可用性的电子商务平台数据库5.1.3 拓展案例 5.2 数据备份策略和工具5.2.1 基础知识5.2.2 重点案例:使用 Python 实现 MySQL 定期备份5.2.3 拓展案例 5.3 灾难恢…

【C++修行之道】(引用、函数提高)

目录 一、引用 1.1引用的基本使用 1.2 引用注意事项 1.3 引用做函数参数 1.4 引用做函数返回值 1.5 引用的本质 1.6 常量引用 1.7引用和指针的区别 二、函数提高 2.1 函数默认参数 2.2函数占位参数 2.3 函数重载 2.4函数重载注意事项 一、引用 1.1引用的基本使用 …

问题:银行账号建立以后,一般需要维护哪些设置,不包括() #学习方法#经验分享

问题:银行账号建立以后,一般需要维护哪些设置,不包括() A.维护结算科目对照 B.期初余额初始化刷 C.自定义转账定义 D.对账单初始化 参考答案如图所示

FPGA_简单工程_无源蜂鸣器驱动实验

一 理论 蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器2中类型,按其有无信号源,分为有源蜂鸣器和无源蜂鸣器。 有源蜂鸣器,内部装有集成电路,不需要音频驱动电路,就直接能发出声响,而无源蜂鸣器&#…

基于OpenCV灰度图像转GCode的斜向扫描实现

基于OpenCV灰度图像转GCode的斜向扫描实现基于OpenCV灰度图像转GCode的斜向扫描实现 引言激光雕刻简介OpenCV简介实现步骤 1.导入必要的库2. 读取灰度图像3. 图像预处理4. 生成GCode5. 保存生成的GCode6. 灰度图像斜向扫描代码示例 总结 系列文章 ⭐深入理解G0和G1指令&…

【多模态】27、Vary | 通过扩充图像词汇来提升多模态模型在细粒度感知任务(OCR等)上的效果

文章目录 一、背景二、方法2.1 生成 new vision vocabulary2.1.1 new vocabulary network2.1.2 Data engine in the generating phrase2.1.3 输入的格式 2.2 扩大 vision vocabulary2.2.1 Vary-base 的结构2.2.2 Data engine2.2.3 对话格式 三、效果3.1 数据集3.2 图像细粒度感…

【网工】华为设备命令学习(Telnet)

本次实验AR3为我们实际中远程的路由,AR4模拟我们的设备,最终实现Telnet的远程控制路由! 本次笔记主要记录Telnet技术实现原理,后续再补充具体配置代码。 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的…

Git中为常用指令配置别名

目录 1 前言 2 具体操作 2.1 创建.bashrc文件 2.2 添加指令 2.3 使其生效 2.4 测试 1 前言 在Git中有一些常用指令比较长,当我们直接输入,不仅费时费力,还容易出错。这时候,如果能给其取个简短的别名,那么事情就…

Cisco firepower2100系列使用FDM管理FTD

Cisco firepower2100系列使用FDM管理FTD 啥是FDM Firepower Device Manager 当思科Firepower系列运行的FTD镜像时,可以通过2种方式进行管理 第1种方式: FMC (Firepower management Center) 可以进行统一管理,一台FMC可以管理多个FTD&…

spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 spring boot 2.4.x 版本之前通过 ConfigFileApplicationListener 加载配置 https://github.com/spring-projects/spring-boot/blob/v2.3.12.RELEASE/spring-boot-project/spring-boot/src/mai…

查大数据检测到风险等级太高是怎么回事?

随着金融风控越来越多元化,大数据作为新兴的技术被运用到贷前风控中去了,不少人也了解过自己的大数据,但是由于相关知识不足,看不懂报告,在常见的问题中,大数据检测到风险等级太高是怎么回事呢?小易大数据…

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记

目录 Shiro简介 复现流程 工具一把梭 半脚本半手动 原理分析 反序列化入口 常见的key 登录过程 验证过程 利用原理 Shiro简介 Apache Shiro 是一个强大且易于使用的 Java 安全框架,用于身份验证、授权、加密和会话管理等安全功能。Shiro 的设计目标是简单…