Swift Combine 发布者publisher的生命周期 从入门到精通四

Combine 系列

  1. Swift Combine 从入门到精通一
  2. Swift Combine 发布者订阅者操作者 从入门到精通二
  3. Swift Combine 管道 从入门到精通三

1. 发布者和订阅者的生命周期

订阅者和发布者以明确定义的顺序进行通信,因此使得它们具有从开始到结束的生命周期:
在这里插入图片描述

  1. 当调用 .subscribe(_: Subscriber) 时,订阅者被连接到了发布者publisher。
  2. publisher发布者随后调用 receive(subscription: Subscription) 来确认该订阅。
  3. 在订阅被确认后,订阅者请求 N 个值,此时调用 request(_: Demand)
  4. publisher发布者可能随后(当它有值时)发送 N 个或者更少的值,通过调用 receive(_: Input)。 发布者不会发送超过需求量的值。
  5. 订阅确认后的任何时间,订阅者都可能调用 .cancel() 来发送 cancellation
    发布者可以选择性地发送 completion:receive(completion:)。 完成可以是正常终止,也可以是通过 .failure 完成,可选地传递一个错误类型。 已取消的管道不会发送任何完成事件。

在上述图表中包含了一组堆积起来的弹珠图, 这是为了突出 Combine 的弹珠图在管道的整体生命周期中的重点。 通常,图表推断所有的连接配置都已完成并已发送了数据请求。 Combine 的弹珠图的核心是从请求数据到触发任何完成或取消之间的一系列事件。

2. publisher发布者

发布者是数据的提供者。 当订阅者请求数据时, publisher protocol 有严格的返回值类型约定,并有一系列明确的完成信号可能会终止它。

你可以从 Just 和 Future 开始使用发布者,它们分别作为单一数据源和异步函数来使用。

当订阅者发出请求时,许多发布者会立即提供数据。 在某些情况下,发布者可能有一个单独的机制,使其能够在订阅后返回数据。 这是由协议 ConnectablePublisher 来约定实现的。 遵循 ConnectablePublisher 的发布者将有一个额外的机制,在订阅者发出请求后才启动数据流。 这可能是对发布者单独的调用 .connect() 来完成。 另一种可能是 .autoconnect(),一旦订阅者请求,它将立即启动数据流。

Combine 提供了一些额外的便捷的发布者:

  • Just
  • Future
  • Deferred
  • Empty
  • Sequence
  • Fail
  • Record
  • Share
  • Multicast
  • ObservableObject
  • @Published

Combine 之外的一些 Apple API 也提供发布者。

  • SwiftUI 使用 @Published@ObservedObject 属性包装,由 Combine 提供,含蓄地创建了一个发布者,用来支持它的声明式 UI 的机制。

Foundation

  • URLSession.dataTaskPublisher
  • .publisher on KVO instance
  • NotificationCenter
  • Timer
  • Result

参考

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

代码

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

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

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

相关文章

课时17:本地变量_命令变量

2.2.3 命令变量 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 基本格式 定义方式一:变量名命令注意: 是反引号定义方式二:变量名$(命令)执行流程:1、执行 或者 $() 范围内的命令…

安卓——计算器应用(Java)

步骤 1: 设置Android Studio项目 创建一个新的Android项目,选择Java作为编程语言。 步骤 2: 设计用户界面 打开activity_main.xml文件,在res/layout目录下,设计你的计算器用户界面。这个例子使用了LinearLayout来排列两个EditText输入框和…

常用C++模版

目录 前言类型转换int 转 stringstring 转 int 进制转换10进制转n进制( 2 ≤ n ≤ 16 , n ∈ Z 2\leq n\leq 16,n\in \mathbb Z 2≤n≤16,n∈Z)n进制转10进制( 2 ≤ n ≤ 16 , n ∈ Z 2\leq n\leq 16,n\in \mathbb Z 2≤n≤16,n∈Z&#xff0…

pycharm像jupyter一样在控制台查看后台变量

更新下:这个一劳永逸不用一个一个改 https://blog.csdn.net/Onlyone_1314/article/details/109347481 右上角运行

Spring IoC容器(四)容器、环境配置及附加功能

本文内容包括容器的Bean 及 Configuration 注解的使用、容器环境的配置文件及容器的附加功能(包括国际化消息、事件发布与监听)。 1 容器配置 在注解模式下,Configuration 是容器核心的注解之一,可以在其注解的类中通过Bean作用…

UniApp 快速上手与深度学习指南

一、UniApp 简介 UniApp 是中国DCloud公司研发的一款创新的跨平台应用开发框架,它基于广受欢迎的前端开发库Vue.js,旨在解决多端适配和快速开发的问题。通过UniApp,开发者能够采用一套统一的代码结构、语法和API来构建应用程序,从而实现真正意义上的“一次编写,到处运行”…

DevOps落地笔记-20|软件质量:决定系统成功的关键

上一课时介绍通过提高工程效率来提高价值交付效率,从而提高企业对市场的响应速度。在提高响应速度的同时,也不能降低软件的质量,这就是所谓的“保质保量”。具备高质量软件,高效率的企业走得更快更远。相反,低劣的软件…

消息中间件之RocketMQ源码分析(八)

RocketMQ中的消息过滤 RocketMQ设计了消息过滤,来解决大量无意义流量的传输:即对于客户端不需要的消息, Broker就不会传输给客户端,以免浪费宽带,RocketMQ4.2.0支持Tag过滤、SQL92过滤、Filter Server过滤 Tag过滤 第一步:用户发…

chrome扩展插件常用文件及作用

Chrome扩展通常包含以下常用文件及其作用: manifest.json: 描述了扩展的基本信息,如名称、版本、权限、图标等。定义了扩展的各种组件和功能,包括后台脚本、内容脚本、页面、浏览器动作按钮等。 background.js: 后台脚…

蓝桥杯Web应用开发-CSS3 新特性【练习三:文本阴影】

文本阴影 text-shadow 属性 给文本内容添加阴影的效果。 文本阴影的语法格式如下: text-shadow: x-offset y-offset blur color;• x-offset 是沿 x 轴方向的偏移距离,允许负值,必须参数。 • y-offset 是沿 y 轴方向的偏移距离&#xff0c…

Swift Combine 管道 从入门到精通三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据,操作符对该数据做出响应并有可能更改它,订阅者请求并接收这些数据。 这…

LoveWall v2.0Pro社区型校园表白墙源码

校园表白墙,一个接近于社区类型的表白墙,LoveWall。 源码特色; 点赞, 发评论, 发弹幕, 多校区, 分享页, 涉及违禁物等名词进行检测! 安装教程: 环境要求;…

一文读懂|Apollo自动驾驶平台9.0全面解读

2023年12月19日,百度正式推出了Apollo开放平台的全新升级版本--Apollo开放平台9.0,面向所有开发者和生态合作伙伴,以更强的算法能力、更灵活易用的工具框架,以及更易拓展的通用场景能力,继续构筑自动驾驶开发的领先优势…

极限的反问题【高数笔记】

1. 什么是极限反问题? 2. 极限反问题分为几类? 3. 每一类极限反问题的具体做法是什么? 4. 每一类极限反问题具体做法是否有前提条件? 5. 例题?

Ubuntu上开启SFTP服务教程

我是卷福同学,目前开始从事安全方面工作,努力学习网络安全基础知识,了解FTP、SFTP、RSYNC服务 在Ubuntu服务器上安全地传输文件,SFTP(SSH文件传输协议)是一个理想的选择。相比于传统的FTP,SFTP通…

本地安全策略 | 服务器管理 | 配置项

本地安全策略 Windows 本地安全策略是一组在本地计算机上配置的安全设置,用于管理计算机的安全性和访问控制。这些策略是针对单个计算机的,与域策略不同,本地安全策略不通过域控制器进行集中管理。本地安全策略通过本地组策略编辑器进行配置…

Objective-C中对象与对象之间的关系

1. 聚合关系(Aggregation) 聚合关系是一种强关联但具有独立生命周期的关系。在聚合关系中,一个对象(容器对象)可以 包含其他对象(成员对象),但成员对象可以独立存在,不…

Linux---线程

线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中,在CPU眼中…

数据结构第十二天(队列)

目录 前言 概述 源码: 主函数: 运行结果: 前言 今天和大家共享一句箴言:我本可以忍受黑暗,如果我不曾见过太阳。 概述 队列(Queue)是一种常见的数据结构,遵循先进先出&#…

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…