Swift Combine 使用 handleEvents 操作符调试管道 从入门到精通二十五

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 进行开发 从入门到精通七
  8. Swift 使用 Combine 管道和线程进行开发 从入门到精通八
  9. Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九
  10. Swift Combine 使用 dataTaskPublisher 发起网络请求 从入门到精通十
  11. Swift Combine 用 Future 来封装异步请求 从入门到精通十一
  12. Swift Combine 有序的异步操作 从入门到精通十二
  13. Swift Combine 使用 flatMap 和 catch错误处理 从入门到精通十三
  14. Swift Combine 网络受限时从备用 URL 请求数据 从入门到精通十四
  15. Swift Combine 通过用户输入更新声明式 UI 从入门到精通十五
  16. Swift Combine 级联多个 UI 更新,包括网络请求 从入门到精通十六
  17. Swift Combine 合并多个管道以更新 UI 元素 从入门到精通十七
  18. Swift Combine 通过包装基于 delegate 的 API 创建重复发布者 从入门到精通十八
  19. Swift Combine 响应NotificationCenter 的更新 从入门到精通十九
  20. Swift Combine 使用 ObservableObject 与 SwiftUI 模型作为发布源 从入门到精通二十
  21. Swift Combine 使用 XCTestExpectation 测试发布者 从入门到精通二十一
  22. Swift Combine 使用 PassthroughSubject 测试订阅者 从入门到精通二十二
  23. Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三
  24. Swift Combine 使用 print 操作符调试管道 从入门到精通二十四
    在这里插入图片描述

1. 使用 handleEvents 操作符调试管道

目的: 使用断点、打印、记录语句或其他额外的逻辑,以便更有针对性地了解管道内发生的情况。

handleEvents 传入数据,不对输出和失败类型或数据进行任何修改。 当你在管道中加入该操作符时,可以指定一些可选的闭包,从而让你能够专注于你想要看到的信息。 具有特定闭包的 handleEvents 操作符是一个打开新窗口的好方法,通过该窗口可以查看管道取消、出错或以其他预期的方式终止时发生的情况。

可以指定的闭包包括:

  • receiveSubscription
  • receiveRequest
  • receiveCancel
  • receiveOutput
  • receiveCompletion

如果每个闭包都包含打印语句,则该操作符将非常像 print 操作符,具体表现在 使用 print 操作符调试管道。

使用 handleEvents 调试的强大之处在于可以选择要查看的内容、减少输出量或操作数据以更好地了解它。

在 UIKit-Combine/GithubViewController.swift 的示例 viewcontroller 中,订阅、取消和 completion 的事件被用于启动或停止 UIActivityIndicatorView。

如果你只想看到管道上传递的数据,而不关心控制消息,那么为 receiveOutput 提供单个闭包并忽略其他闭包可以让你专注于这些详细信息。

handleEvents 的单元测试示例展示了所有可提供的闭包:

UsingCombineTests/HandleEventsPublisherTests.swift

.handleEvents(receiveSubscription: { aValue inprint("receiveSubscription event called with \(String(describing: aValue))")  // 2
}, receiveOutput: { aValue in  // 3print("receiveOutput was invoked with \(String(describing: aValue))")
}, receiveCompletion: { aValue in  // 4print("receiveCompletion event called with \(String(describing: aValue))")
}, receiveCancel: {  // 5print("receiveCancel event invoked")
}, receiveRequest: { aValue in  // 1print("receiveRequest event called with \(String(describing: aValue))")
})
  1. 第一个被调用的闭包是 receiveRequest,所需要的值(the demand value)将传递给它。
  2. 第二个闭包 receiveSubscription 通常是从发布者返回的订阅消息,它将对订阅的引用传递给发布者。 此时,管道已运行,发布者将根据原始请求中请求的数据量提供数据。
  3. 当发布者提供这些数据时,这些数据将传递到 receiveOutput 中,每次有值传递过来都将调用该闭包。 这将随着发布者发送更多的值而重复调用。
  4. 如果管道正常关闭或因失败而终止,receiveCompletion 闭包将收到 completion 事件。 就像 sink 闭包一样,你可以对提供的 completion 事件使用 switch,如果它是一个 .failure completion,那么你可以检查附带的错误。
  5. 如果管道被取消,则将调用 receiveCancel 闭包。 不会有任何数据传递到该取消闭包中。

虽然你还可以使用 breakpoint 和 breakpointOnError 操作符进入调试模式(如使用调试器调试管道 中所示),带有闭包的 handleEvents() 操作符允许你在 Xcode 内设置断点。 这允许你立即进入调试器,检查流经管道的数据,或获取订阅者的引用,或在失败的 completion 事件中获取错误信息。

参考

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

代码

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

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

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

相关文章

【GO语言卵细胞级别教程】07.捕获异常和自定义错误

【GO语言卵细胞级别教程】07.捕获异常和自定义错误 🥰博主:GokuCode 🥰微信公众号:【给点知识】分享小知识,快速成长,欢迎关注呀!(底部点击二维码) 🥰本项目演示代码仓库…

Windows Server 2012 IIS中发布ASP.NET CORE项目

服务器安装IIS: 微软官网下载SDK: 下载Runtime官网:https://dotnet.microsoft.com/download/dotnet-core 安装成功重启IIS: VS发布项目:

分享:如何做好Temu跨境电商项目的几点方法

Temu跨境电商项目作为中国电商巨头拼多多旗下的新兴跨境电商平台,近年来发展迅速,吸引了大量国内卖家参与。然而,由于跨境电商的复杂性和竞争激烈,如何在Temu平台上成功运营,实现良好的销售业绩,成为许多卖…

Chiplet技术与汽车芯片(二)

目录 1.回顾 2.Chiplet的优势 2.1 提升芯片良率、降本增效 2.2 设计灵活,降低设计成本 2.3 标准实行,构建生态 3.Chiplet如何上车 1.回顾 上一篇,我们将来芯粒到底是什么东西,本篇我们来看芯粒技术的优势,以及它…

软考39-上午题-【数据库】-关系代数运算1-传统的集合运算

一、笛卡尔积 二、关系代数 关系代数是施加于关系之上的集合代数运算。 关系代数包含: 传统的集合运算专门的关系运算 2-1、传统的集合运算 1、关系的并 示例: 2、关系的差 示例: 3、关系的交 示例: 关系的并、差、交&#xf…

一 . java语言概述——Java基础篇

一 . java语言概述——Java基础 发展阶段: 发行版本发行时间备注Java 1.01996.01.23Sun公司发布了Java的第一个开发工具包Java 1.11997.02.19JavaOne会议召开,创当时全球同类会议规模之最。Java 1.21998.12.08Java拆分成:J2SE(标…

用户头像(图片文件)上传(Vue + nodejs 前后端)

文件上传&#xff08;图片上传&#xff09; 前端&#xff1a;Vue3 element-plus 后端&#xff1a;express 前端 封装一个 Upload 组件和一个 upload 方法。 Upload 组件 <!-- auto-upload 选择好图片后立刻自动上传后端还是手动点击某按钮上传后端 --><el-upload…

jax可微分编程的笔记(3)

jax可微分编程的笔记&#xff08;3&#xff09; 第3章 初识JAX JAX是Google开发的高性能数值计算和自动微分库&#xff0c;提供自动微分 即时编译和矢量并行化三大功能。JAX选择将函数编程的思想贯穿 始终。 简单来说&#xff0c;JAX库是GPU加速&#xff0c;支持自动微分的Nu…

android pdf框架-4,分析barteksc/PdfiumAndroid源码1

关于barteksc/PdfiumAndroid barteksc/PdfiumAndroid 这个源码被,引用的次数是比较高的,flutter的几个pdf库也是引用它.它使用福昕的开源sdk.福昕阅读器我早期的时候用,交互一般,渲染也不如mupdf,有些pdf中文显示不了,体积小点. barteksc/PdfiumAndroid已经是一个完善的sdk了,…

微信小程序开发(实战案例):本地生活 - 列表页面开发(动态渲染处理)、节流防抖(节流阀应用)

文章目录 本地生活 - 列表页面开发一、将九宫格分类换成navigator组件二、动态设置商品列表页的 title三、动态渲染商品列表页面四、上拉触底加载数据五、添加Loading加载效果六、数据加载节流防抖处理 本地生活 - 列表页面开发 导入我们上次写的 本地生活 - 首页开发的项目 运…

leetcode 50. Pow(x, n)

目录 函数定义&#xff1a; 2. 处理特殊情况&#xff1a; 3. 处理负指数&#xff1a; 4. 处理偶数指数&#xff1a; 5. 处理奇数指数&#xff1a; 时间复杂度 空间复杂度 class Solution { public:double myPow(double x, int n) {if(n 0){return 1;}if(n 1) return x…

C#设计模式---工厂方法模式

24种常用设计模式 创建型模式&#xff1a;抽象工厂、生成器、工厂方法、原型、单例&#xff1b; 结构型模式&#xff1a;适配器、桥接、组合、装饰、外观、享元、代理&#xff1b; 行为模式&#xff1a;责任链、命令、迭代器、中介者、备忘录、观察者、状态、策略、模板方法…

二分算法(c++版)

二分的本质是什么&#xff1f; 很多人会认为单调性是二分的本质&#xff0c;但其实其本质并非单调性&#xff0c;只是说&#xff0c;有单调性的可以进行二分&#xff0c;但是有些题目没有单调性我们也可以进行二分。其本质其实是一个边界问题&#xff0c;给定一个条件&#xf…

golang的map是如何扩容的【重点】

具体内容参考链接 https://zhuanlan.zhihu.com/p/616979764 Golang的map就是使用哈希表作为底层实现&#xff0c;map 实际上就是一个指针&#xff0c;指向hmap结构体。 Go 语言中的 map 在扩容时&#xff0c;会重新分配更大的内存空间&#xff0c;并将原有的键值对重新哈希到新…

【机器学习基础】一元线性回归(适合初学者的保姆级文章)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

python 函数-03-参数

入参不需要指定类型&#xff0c;只需要参数名称即可 【特殊性&#xff0c;区别于java c#等】传参两种方式&#xff1a; 位置参数 如 cube_volume(1, 2, 3) 关键字参数 如 cube_volume(width 1, height 2, length 3)参数为可变对象&#xff0c;如当参数为列表时&#xff0c;在…

趣学贝叶斯统计:条件概率(1)

前言 到目前为止&#xff0c;我们只讨论了独立事件的概率。当一个事件的结果不影响另一个事件的结果时&#xff0c;这两个事件就是独立事件。例如&#xff0c;掷硬币时出现正面并不影响掷骰子是否会掷出6点。计算独立事件的概率要比计算非独立事件的概率容易得多&#xff0c;但…

ES6 字符串面试题

如何判断字符串 “Hello, World!” 是否以 “Hello” 开头&#xff1f; 答案&#xff1a; const str "Hello, World!"; const startsWithHello str.startsWith("Hello"); console.log(startsWithHello); // 输出 true如何判断字符串 “Hello, World!” …

C 标准库 - <stdlib.h>

简介 <stdlib.h> 头文件定义了四个变量类型、一些宏和各种通用工具函数。 库变量 下面是头文件 stdlib.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t2wchar_t3div_t4ldiv_t 库宏 下面是头文件 stdlib.h 中定义的宏&#xff1a; 序号宏 & 描述1…

conntrack-tools 内核依赖,

1 内核依赖 You require a Linux kernel version > 2.6.18. Connection Tracking System. CONFIG_NF_CONNTRACKm CONFIG_NF_CONNTRACK_IPV4m CONFIG_NF_CONNTRACK_IPV6m (if your setup supports IPv6) nfnetlink: the generic messaging interface for Netfilter. CONF…