Swift Combine 网络受限时从备用 URL 请求数据 从入门到精通十四

2024-02-14 16:52

本文主要是介绍Swift Combine 网络受限时从备用 URL 请求数据 从入门到精通十四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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错误处理 从入门到精通十三
    在这里插入图片描述

1. 使用 flatMap 和 catch 在不取消管道的情况下处理错误

目的: flatMap 操作符可以与 catch 一起使用,以持续处理新发布的值上的错误。

flatMap 是用于处理持续事件流中错误的操作符。

你提供一个闭包给 flatMap,该闭包可以获取所传入的值,并创建一个一次性的发布者,完成可能失败的工作。 这方面的一个例子是从网络请求数据,然后将其解码。 你可以引入一个 catch 操作符,以捕获任何错误并提供适当的值。

当你想要保持对上游发布者的更新时,这是一个完美的机制,因为它创建一次性的发布者或短管道,发送一个单一的值,然后完成每一个传入的值。 所创建的一次性发布者的完成事件在 flatMap 中终止,并且不会传递给下游订阅者。

一个使用 dataTaskPublisher 的这样的例子:

let remoteDataPublisher = Just(self.testURL!)  // 1.flatMap { url in  // 2URLSession.shared.dataTaskPublisher(for: url)  // 3.tryMap { data, response -> Data in  // 4guard let httpResponse = response as? HTTPURLResponse,httpResponse.statusCode == 200 else {throw TestFailureCondition.invalidServerResponse}return data}.decode(type: PostmanEchoTimeStampCheckResponse.self, decoder: JSONDecoder())  // 5.catch {_ in  // 6return Just(PostmanEchoTimeStampCheckResponse(valid: false))}}.eraseToAnyPublisher()
  1. Just 以传入一个 URL 作为示例启动此发布者。
  2. flatMap 以 URL 作为输入,闭包继续创建一次性发布者管道。
  3. dataTaskPublisher 使用输入的 url 发出请求。
  4. 输出的结果(一个 (Data, URLResponse) 元组)流入 tryMap 以解析其他错误。
  5. decode 尝试将返回的数据转换为本地定义的类型。
  6. 如果其中任何一个失败,catch 将把错误转换为一个默认的值。 在这个例子中,是具有预设好 valid = false 属性的对象。

2. 网络受限时从备用 URL 请求数据

目的: 在 Apple 的 WWDC 2019 演示 Advances in Networking, Part 1 中,使用 tryCatchtryMap 操作符提供了示例模式,以响应网络受到限制的特殊错误。

// Generalized Publisher for Adaptive URL Loading
func adaptiveLoader(regularURL: URL, lowDataURL: URL) -> AnyPublisher<Data, Error> {var request = URLRequest(url: regularURL)  // 1request.allowsConstrainedNetworkAccess = false  // 2return URLSession.shared.dataTaskPublisher(for: request)  // 3.tryCatch { error -> URLSession.DataTaskPublisher in  // 4guard error.networkUnavailableReason == .constrained else {throw error}return URLSession.shared.dataTaskPublisher(for: lowDataURL)  // 5.tryMap { data, response -> Data inguard let httpResponse = response as? HTTPUrlResponse,  // 6httpResponse.statusCode == 200 else {throw MyNetworkingError.invalidServerResponse}return data
}
.eraseToAnyPublisher()  // 7

在苹果的 WWDC 中的这个例子,提供了一个函数,接受两个 URL 作为参数 —— 一个主要的 URL 和一个备用的。 它会返回一个发布者,该发布者将请求数据,并在网络受到限制时向备用 URL 请求数据。

  1. request 变量是一个尝试请求数据的 URLRequest
  2. 设置 request.allowsConstrainedNetworkAccess 将导致 dataTaskPublisher 在网络受限时返回错误。
  3. 调用 dataTaskPublisher 发起请求。
  4. tryCatch 用于捕获当前的错误状态并检查特定错误(受限的网络)。
  5. 如果它发现错误,它会使用备用 URL 创建一个新的一次性发布者。
  6. 由此产生的发布者仍可能失败,tryMap 可以基于对应到错误条件的 HTTP 响应码来抛出错误,将此映射为失败。
  7. eraseToAnyPublisher 可在操作符链上进行类型擦除,因此 adaptiveLoader 函数的返回类型为 AnyPublisher<Data, Error>

在示例中,如果从原始请求返回的错误不是网络受限的问题,则它会将 .failure 结束事件传到管道中。 如果错误是网络受限,则 tryCatch 操作符会创建对备用 URL 的新请求。

参考

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

代码

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

这篇关于Swift Combine 网络受限时从备用 URL 请求数据 从入门到精通十四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/709072

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解