【iOS Swift Moya 最新请求网络框架封装通用】

【iOS Swift Moya 最新请求网络框架封装通用】

  • 前言
    • 框架结构
    • 1.API定义(TargetType)
    • 2. 配置MoyaProvider
    • 3. 网络管理器
    • 4. 使用示例
    • 注意事项
    • 进一步优化

前言

设计一个基于Moya的网络请求框架,可以提供灵活的网络请求管理,例如设置请求超时时间、暂停某个正在进行的请求等功能。以下让我们一起来设计框架示例,包括关键部分的代码实现和详细说明。

框架结构

1. API定义(TargetType): 定义所有的API接口。
2. 网络提供者(MoyaProvider): 配置MoyaProvider,包括自定义Session以设置请求超时时间。
3. 网络管理器、网络响应处理 : 管理请求的发起、暂停和恢复;处理网络请求的响应和错误。
4. 使用实例。

1.API定义(TargetType)

  • 首先,定义一个符合TargetType协议的枚举来描述所有的API接口。例如,假设我们有一个用户相关的API:

    import Moyaenum UserAPI {case getUser(id: Int)case updateUser(id: Int, parameters: [String: Any])// 其他API接口
    }extension UserAPI: TargetType {var baseURL: URL {return URL(string: "https://api.example.com")!}var path: String {switch self {case .getUser(let id):return "/user/\(id)"case .updateUser(let id, _):return "/user/\(id)"}}var method: Moya.Method {switch self {case .getUser:return .getcase .updateUser:return .put}}var task: Task {switch self {case .getUser:return .requestPlaincase .updateUser(_, let parameters):return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)}}var headers: [String : String]? {return ["Content-Type": "application/json"]}var sampleData: Data {// 提供模拟数据return Data()}
    }
    

2. 配置MoyaProvider

  • 为了设置请求超时时间,我们需要自定义Session并传递给MoyaProvider。同时,为了管理请求任务,我们需要保存Cancellable对象。

    import Moya
    import Alamofireclass NetworkProvider {static let shared = NetworkProvider()private let provider: MoyaProvider<UserAPI>private var cancellables: [String: Cancellable] = [:]private var pendingRequests: [String: (target: UserAPI, completion: (Result<Response, MoyaError>) -> Void)] = [:]private let lock = NSLock()private init() {let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 30 // 设置请求超时时间为30秒configuration.timeoutIntervalForResource = 60 // 设置资源请求超时时间为60秒let session = Alamofire.Session(configuration: configuration)provider = MoyaProvider<UserAPI>(session: session, plugins: [NetworkLoggerPlugin()])}/// 发起网络请求func request(_ target: UserAPI,identifier: String? = nil,completion:  (Result<Response, MoyaError>) -> Void) {let id = identifier ?? UUID().uuidStringpendingRequests[id] = (target, completion)let cancellable = provider.request(target) { [weak self] result inself?.lock.lock()self?.cancellables.removeValue(forKey: id)self?.pendingRequests.removeValue(forKey: id)self?.lock.unlock()completion(result)}lock.lock()cancellables[id] = cancellablelock.unlock()}/// 暂停指定的请求func pauseRequest(identifier: String) {lock.lock()if let cancellable = cancellables[identifier] {cancellable.cancel()cancellables.removeValue(forKey: identifier)// 请求已取消,保留在pendingRequests以便恢复}lock.unlock()}/// 暂停所有请求func pauseAllRequests() {lock.lock()for (id, cancellable) in cancellables {cancellable.cancel()// 请求已取消,保留在pendingRequests以便恢复}cancellables.removeAll()lock.unlock()}/// 重新发起指定的请求func resumeRequest(identifier: String) {lock.lock()guard let request = pendingRequests[identifier] else {lock.unlock()return}let cancellable = provider.request(request.target) { [weak self] result inself?.lock.lock()self?.cancellables.removeValue(forKey: identifier)self?.pendingRequests.removeValue(forKey: identifier)self?.lock.unlock()request.completion(result)}cancellables[identifier] = cancellablelock.unlock()}/// 重新发起所有请求func resumeAllRequests() {lock.lock()for (id, request) in pendingRequests {let cancellable = provider.request(request.target) { [weak self] result inself?.lock.lock()self?.cancellables.removeValue(forKey: id)self?.pendingRequests.removeValue(forKey: id)self?.lock.unlock()request.completion(result)}cancellables[id] = cancellable}lock.unlock()}
    }
    

    说明:

    • 自定义Session: 通过URLSessionConfiguration设置请求超时时间。
    • 管理Cancellable: 使用字典cancellables来保存每个请求的Cancellable对象,通过唯一标识符管理请求的取消。
    • 请求方法: request方法用于发起请求,并保存Cancellable对象。
    • 暂停请求: pauseRequest方法通过标识符取消指定的请求,pauseAllRequests取消所有请求。

3. 网络管理器

  • 创建一个更高层次的网络管理器,用于处理不同类型的API请求,提供更方便的接口给业务层使用。

    import Foundation
    import Moyaclass NetworkManager {static let shared = NetworkManager()private let networkProvider = NetworkProvider.sharedprivate init() {}/// 获取用户信息func getUser(id: Int, identifier: String? = nil, completion:  (Result<Response, MoyaError>) -> Void) {networkProvider.request(.getUser(id: id), identifier: identifier, completion: completion)}/// 更新用户信息func updateUser(id: Int, parameters: [String: Any], identifier: String? = nil, completion:  (Result<Response, MoyaError>) -> Void) {networkProvider.request(.updateUser(id: id, parameters: parameters), identifier: identifier, completion: completion)}/// 暂停指定请求func pauseRequest(identifier: String) {networkProvider.pauseRequest(identifier: identifier)}/// 暂停所有请求func pauseAllRequests() {networkProvider.pauseAllRequests()}/// 重新发起指定请求func resumeRequest(identifier: String) {networkProvider.resumeRequest(identifier: identifier)}/// 重新发起所有请求func resumeAllRequests() {networkProvider.resumeAllRequests()}// 其他API接口的封装
    }
    

    说明:

    • NetworkManager封装了所有的API接口调用,提供统一的入口。

    • 通过identifier参数,可以为每个请求指定唯一标识符,以便后续管理(暂停、取消等)。

    • 需要注意的是,HTTP请求本身并不支持暂停和恢复,只能取消并重新发起请求。如果实现类似暂停和恢复的功能,通常需要在请求被取消后,重新发起相同的请求。

4. 使用示例

  • 下面是如何使用上述框架进行网络请求、设置超时和暂停请求的示例。

    import UIKit
    import Moyaclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()// 发起获取用户信息的请求let requestIdentifier = "getUser_123"NetworkManager.shared.getUser(id: 123, identifier: requestIdentifier) { result inswitch result {case .success(let response):do {// 解析数据let json = try response.mapJSON()print("User Info: \(json)")} catch {print("解析错误: \(error)")}case .failure(let error):print("请求失败: \(error)")}}// 示例:在某个时刻暂停请求// NetworkManager.shared.pauseRequest(identifier: requestIdentifier)// 示例:在另一个时刻恢复请求// NetworkManager.shared.resumeRequest(identifier: requestIdentifier)}
    }
    

    说明:

    • 发起请求时,提供一个唯一的identifier用于后续管理。
    • 可以根据业务需求,在适当的时机调用pauseRequest或pauseAllRequests来取消请求。

注意事项

  1. 暂停和恢复请求: HTTP请求本身不支持暂停和恢复,pause操作实际上是取消请求,resume操作需要重新发起相同的请求。
  2. 线程安全: 使用NSLock确保对cancellables和pendingRequests的访问是线程安全的。
  3. 请求标识符: 为每个请求提供唯一的标识符,以便后续管理。可以使用UUID或自定义的字符串。
  4. 错误处理: 根据实际需求,完善错误处理和重试机制。
  5. 扩展性: 可以根据项目需求,进一步扩展网络框架,例如添加更多的插件、支持多种认证方式等。

进一步优化

  1. 支持多种API接口: 将UserAPI扩展为包含所有需要的API接口,或者使用多个TargetType枚举。
  2. 响应解析: 提供统一的响应解析方法,例如使用Codable解析JSON数据。
  3. 缓存机制: 根据需求添加网络缓存策略,提高性能。
  4. 重试机制: 对于失败的请求,添加自动重试机制。

通过以上设计和实现,您将拥有一个基于Moya的灵活且功能完整的网络请求框架,能够满足设置请求超时时间、暂停和恢复请求等需求。

需要讨论可加V:Jun_Yeong-Huang

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

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

相关文章

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

链上数据分析基础课:Puell倍数(Puell Multiple)

PUELL倍数&#xff08;Puell Multiple&#xff09;就是每日币发行金额除以365天的移动平均 每日币发行总额&#xff0c;简单说就是每天结算的币总量和过去一年的平均每天收成的比。这个指标能让我们大概了解矿工的收益情况&#xff0c;还能从矿工的角度看市场趋势和周期变化。 …

初学STM32 --- USMART

目录 USMART简介 USMART主要特点&#xff1a; USMART原理 USMART组成&#xff1a; USMART 的实现流程简单概括 USMART扫描函数&#xff1a; USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff01; USMART主…

对话|企业如何构建更完善的容器供应链安全防护体系

对话&#xff5c;企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起&#xff0c;容器技术和自动化成为软件开发中的必要手段&#xff0c;软件供应链也进入了自动化及 CI/CD 阶段。然而&#xff0c;容器技术和自动化虽然提升了软件的更新速度&…

Backend - EF Core(C# 操作数据库 DB)

目录 一、EF Core 1. 使用的ORM框架&#xff08;对象关系映射&#xff09; 2. EFCore 常见两种模式 3. EFCore 提供程序 二、 EF 操作数据库&#xff08;Code First&#xff09; 1. 下载NuGet插件 2.创建模型类文件 3.创建DBContext文件 4.Programs.cs文件 5.appsettings.Devel…

科研绘图系列:R语言单细胞数据常见的可视化图形

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…

jenkins入门7 --发送邮件1

jenkins发送邮件配置&#xff08;全局配置&#xff09;_jenkins 怎么发送邮件-CSDN博客 本文通过163发送邮件 1、首先163设置选择pop3/smtp/imap,开启服务&#xff0c;获取授权码 2、jenkins下载邮件插件 登录Jenkins管理界面&#xff0c;点击“Manage Jenkins”。 选择“Man…

30、论文阅读:基于小波的傅里叶信息交互与频率扩散调整的水下图像恢复

Wavelet-based Fourier Information Interaction with Frequency Diffusion Adjustment for Underwater Image Restoration 摘要介绍相关工作水下图像增强扩散模型 论文方法整体架构离散小波变换与傅里叶变换频率初步增强Wide Transformer BlockSpatial-Frequency Fusion Block…

衡量算法效率的方法:时间复杂度、空间复杂度

衡量算法效率的方法&#xff1a;时间复杂度、空间复杂度 一、好算法的特点二、算法效率分析1. 时间复杂度2. 空间复杂度 一、好算法的特点 算法是用数学解决问题的方法。一个好算法有以下几个特点&#xff1a; ①正确性&#xff1a;能正确处理各种输入&#xff08;合法输入、非…

go如何从入门进阶到高级

针对Go语言的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以达到最佳效果.本文将Go的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍 一、社区 Go语言中文网 作为专注于Go语言学习与推广的平台&#xff0c;Go语言中文网为开发者提供了丰富的中…

苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序

前言 苹果系统下使用opencv感觉还是有些不太方便&#xff0c;总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型&#xff1a; 选择界面模式和编程语言&#xff1a; 其余…

Nginx——入门介绍、安装与核心配置文件结构(一/五)

目录 1.Nginx 简介1.1.背景介绍1.2.名词解释1.3.常见服务器对比1.3.1.IIS1.3.2.Tomcat1.3.3.Apache1.3.4.Lighttpd1.3.5.其他的服务器 1.4.Nginx 的优点1.4.1.速度更快、并发更高1.4.2.配置简单&#xff0c;扩展性强1.4.3.高可靠性1.4.4.热部署1.4.5.成本低、BSD 许可证 1.5.Ng…

【HarmonyOS-ArkTS语言】计算器的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f3af;学习小目标&#xff1a; &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1. 在index.ets文件中通过 Extend(Button) 装饰器扩展Button 组件设置按钮样式函数myButt…

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…

【连续学习之LwM算法】2019年CVPR顶会论文:Learning without memorizing

1 介绍 年份&#xff1a;2019 期刊&#xff1a; 2019CVPR 引用量&#xff1a;611 Dhar P, Singh R V, Peng K C, et al. Learning without memorizing[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2019: 5138-5146. 本文提…

【微服务】3、配置管理

微服务配置管理 已掌握的微服务组件及配置管理问题引出 已掌握注册中心、Openfan、远程调用、负载均衡、网关等组件&#xff0c;具备微服务开发能力&#xff0c;但仍存在其他问题待解决。微服务和网关存在大量配置文件&#xff0c;其中包含很多重复配置&#xff0c;如数据库、日…

【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站

为了实现一个基于Spring和Spring MVC的汉服文化宣传网站,我们需要创建一个简单的Web应用程序来展示汉服文化和相关信息。这个系统将包括以下几个部分: 数据库表设计:定义文章、用户和评论的相关表。实体类:表示数据库中的数据。DAO层接口及MyBatis映射文件:用于与数据库交…

Apache Celeborn 在B站的生产实践

背景介绍 Shuffle 演进 随着B站业务的飞速发展,数据规模呈指数级增长,计算集群也逐步从单机房扩展到多机房部署模式。多个业务线依托大数据平台驱动核心业务,大数据系统的高效性与稳定性成为公司业务发展的重要基石。如图1,目前在大数据基础架构下,我们主要采用 Spark、Fl…

计算机网络:网络层知识点及习题(一)

网课资源&#xff1a; 湖科大教书匠 1、概述 网络层实现主机到主机的传输&#xff0c;主要有分组转发和路由选择两大功能 路由选择处理机得出路由表&#xff0c;路由表再生成转发表&#xff0c;从而实现分组从不同的端口转发 网络层向上层提供的两种服务&#xff1a;面向连接…