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

相关文章

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口