iOS(swiftui)——网络连接(Moya)

Moya 是一个流行的 Swift 网络抽象层,被用于简化 iOS 应用程序中的网络请求。使用 Moya,可以定义网络请求的方式,增加类型安全性,因为所有的网络请求都是经过 Swift 类型系统检查的,并且 Moya 提供了一种很好的方式来将网络请求代码组织得更加清晰和可维护。

Moya 的核心是一个 TargetType 协议,它定义了一个 API 端点的所有必要信息,包括路径、方法、任务、HTTP 任务和可能的测试数据。开发者需要为所消费的每一个 API 端点创建一个符合 TargetType 协议的枚举 case。
 官网:https://github.com/Moya/Moya/blob/master/Readme_CN.md

1. 首先在项目中添加Moya 依赖

xcode swiftui项目添加依赖-CSDN博客

2.定义网络通用模型


比如你的接口返回数据结构如下:

{code:200,message:"成功",data:{}
}

定义一个BaseDetailResponse结构体为网络通用模型

import HandyJSON// 通用网络请求模型
struct BaseDetailResponse<T: HandyJSON>: HandyJSON {var code: Int?var message: String?var data: T?
}

3. 定义一个 TargetType 协议的枚举

import Moyaenum RequestApi {//获取会议信息case getMeetingroom(meetingNum:Int)
}// MARK: - 实现TargetType协议
extension RequestApi:TargetType{var sampleData: Data {switch self {case .getMeetingroom:return "{\"token\": \"sample token\"}".data(using: .utf8)!// 其他 API 请求的测试数据...case .getCaptions:return "{\"token\": \"sample token\"}".data(using: .utf8)!}}var baseURL: URL {let url = "域名"return URL(string: url)!}// 返回每个请求的路径var path: String {switch self{case .getMeetingroom:return "xx/xx"default:fatalError("Request path is null")}}var method: Moya.Method {switch self{case .getMeetingroom:return .postdefault:return.get}}var task: Moya.Task {switch self{case .getMeetingroom(let meetingNum):// 用于编码成x-www-form-urlencoded的参数let params: [String: Any] = ["meetingNum": meetingNum]return .requestParameters(parameters: params, encoding: URLEncoding.default)default://不传递任何参数return .requestPlain}}/// 请求头var headers: [String : String]? {var headers:Dictionary<String,String> = [:]//内容的类型switch self{case .getMeetingroom:headers["Content-Type"]="application/x-www-form-urlencoded"breakdefault:break}return headers}
}

 4. 定义接口返回数据模型

若getMeetingroom返回数据结构为

{meetingNum:4234234234,meetingName:"会议"
}

 定义会议信息结构体

struct MeetingInfo: HandyJSON {var meetingNum:Intvar meetingName:Stringinit() {self.meetingNum = 0self.meetingName = ""}
}

5. 初始化网络请求,发送请求

使用 MoyaProvider 来初始化网络请求,发送请求,并处理响应或者错误。

//
//  DoRequest.swift
//import Foundation
import Moya
import RxSwift
import HandyJSONclass DoRequest{static let shared = DoRequest()private var provider:MoyaProvider<RequestApi>!// MARK:func getMeetingroom(data:Int, completion: @escaping (BaseDetailResponse<MeetingInfo>?, Error?) -> ()) {provider.request(.getMeetingroom(meetingNum: data)){ result inswitch result {case let .success(response):if let jsonResponse = BaseDetailResponse<MeetingInfo>.deserialize(from: String(data: response.data, encoding: .utf8)) {completion(jsonResponse, nil)} else {print("Decoding Error")completion(nil, DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "Decoding error")))}case let .failure(error):print(error.errorDescription ?? "error")completion(nil, error)}}}/// 私有构造方法 主要为了打印后台请求到的数据 便于查看private init() {//网络请求加载对话框let networkActivityPlugin = NetworkActivityPlugin { change, target in//changeType类型是NetworkActivityChangeType//通过它能监听到开始请求和结束请求 //targetType类型是TargetType//就是我们这里的service //通过它能判断是那个请求if change == .began {//开始请求let targetType = target as! RequestApiswitch targetType {case .getMeetingroom:DispatchQueue.main.async {//切换到主线程 才可以操作view}default:break}} else {//结束请求DispatchQueue.main.async {}}}plugins.append(networkActivityPlugin)provider = MoyaProvider<RequestApi>(plugins: plugins)}
}

5. 使用示例 

            let intValue = Int("4234234234")!let meetingInfo = MeetingInfo()DoRequest.shared.getMeetingroom(data: intValue) { (response, error) inif let response = response {if let code = response.code{if(code == 200){// 处理你的响应if let data = response.data {// Use meetingRoomInfo heremeetingInfo = data}}else{self.alertMessage = response.message!self.showAlert = true}}} else if let error = error {//登录失败self.showAlert = trueself.alertMessage = error.localizedDescriptionreturn}}

 

 

 

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

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

相关文章

利用 Python 进行数据分析实验(五)

一、实验目的 使用Python解决问题 二、实验要求 自主编写并运行代码&#xff0c;按照模板要求撰写实验报告 三、实验步骤 1 爬取并下载当当网某一本书的网页内容&#xff0c;并保存为html格式 2 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值(自学正则表达式) …

交叉验证以及scikit-learn实现

交叉验证 交叉验证既可以解决数据集的数据量不够大问题&#xff0c;也可以解决参数调优的问题。 主要有三种方式&#xff1a; 简单交叉验证&#xff08;HoldOut检验&#xff09;、k折交叉验证&#xff08;k-fold交叉验证&#xff09;、自助法。 本文仅针对k折交叉验证做详细解…

ZooKeeper学习一

一、概念 ZooKeeper是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作&#xff0c;最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基于ZooKeeper实现…

GO设计模式——4、单例模式(创建型)

目录 单例模式&#xff08;Singleton Pattern&#xff09; 优缺点 使用场景 饿汉式和懒汉式单例模式 单例模式&#xff08;Singleton Pattern&#xff09; 单例模式&#xff08;Singleton Pattern&#xff09;是一个类只允许创建一个对象&#xff08;或者实例&#xff…

基于ssm vue个人需求和地域特色的外卖推荐系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

利用管道、信号量、信号、共享内存和消息队列进行多进程通信

一.管道&#xff08;分为命名管道和匿名管道&#xff09; 管道的特点&#xff1a; ①无论是命名管道还是匿名管道&#xff0c;写入管道的数据都存放在内存之中。 ②管道是一种半双工的通信方式&#xff08;半双工是指终端A能发信号给终端B&#xff0c;终端B也能发信号给终端…

css的4种引入方式--内联样式(标签内style)、内部样式表(<style>)、外部样式表(<link>、@import)

1.内联样式&#xff08;Inline Styles&#xff09;&#xff1a;可以直接在HTML元素的style属性中定义CSS样式。 例如&#xff1a; <p style"color: red; font-size: 16px;">这是一段红色的文本</p>内联样式适用于对单个元素应用特定的样式&#xff0c;…

软件开发安全指南

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件开发全资料获取&#xff1a;点我获取

Linux 网络协议

1 网络基础 1.1 网络概念 网络是一组计算机或者网络设备通过有形的线缆或者无形的媒介如无线&#xff0c;连接起来&#xff0c;按照一定的规则&#xff0c;进行通讯的集合( 缺一不可 )。 5G的来临以及IPv6的不断普及&#xff0c;能够进行联网的设备将会是越来越多&#xff08…

ERP数据仓库模型

ERP数据仓库模型建设是一个复杂的过程&#xff0c;涉及到多个主题域。以下是一个详细的设计方案&#xff1a; 确定业务需求和目标 在开始设计数据仓库模型之前&#xff0c;需要了解企业的业务需求和目标。这包括了解企业的运营模式、业务流程、关键绩效指标等。通过与业务部门…

vue 商品列表案例

my-tag 标签组件的封装 1. 创建组件 - 初始化 2. 实现功能 (1) 双击显示&#xff0c;并且自动聚焦 v-if v-else dbclick 操作 isEdit 自动聚焦&#xff1a; 1. $nextTick > $refs 获取到dom&#xff0c;进行focus获取焦点 2. 封装v-focus指令 (2) 失去焦点&#xff0c;隐藏…

Unity 程序运行后的日志信息路径

Unity 游戏程序运行后&#xff0c;在后台有个路径文件专门用于日志信息记录。 当运行程序发生错误时&#xff0c;我们可以通过查用该日志&#xff0c;获取相关有用信息&#xff0c;对我们处理Bug会有很大帮助。 在Windows平台上&#xff0c;该路径是&#xff1a; C:\Users\&…

用Rust刷LeetCode之66 加一

66. 加一[1] 难度: 简单 func plusOne(digits []int) []int { length : len(digits) // 从最低位开始遍历&#xff0c;逐位加一 for i : length - 1; i > 0; i-- { if digits[i] < 9 { digits[i] return digits } d…

【Mac】brew提示arch -arm64 brew以及uname返回x86_64的问题

背景 使用MacBook 14 M1 Pro两年了&#xff0c;自从使用了第三方Shell工具WindTerm后&#xff0c;使用brew时会提示我使用arch -arm64 brew安装&#xff0c;一开始没太在意&#xff0c;直到今天朋友问我uname -a返回的是什么架构&#xff0c;我才惊讶的发现竟然返回的是x86_64…

优化系统性能:深入性能测试的重要性与最佳实践

目录 引言 1. 为什么性能测试重要&#xff1f; 1.1 用户体验 1.2 系统稳定性 1.3 成本节约 1.4 品牌声誉 2. 性能测试的关键步骤 2.1 制定性能测试计划 2.2 确定性能测试类型 2.3 设计性能测试用例 2.4 配置性能测试环境 2.5 执行性能测试 2.6 分析和优化 2.7 回…

QT----Visual Studio打开.ui文件报错无法打开

问题 在我安装完qt后将它嵌入vs&#xff0c;后新建的文件无法打开ui文件 解决方法 右击ui文件打开方式,添加,程序找到你qt的安装目录里的designer.exe。点击确定再次双击就能够打开。

JAVA 通过get,post访问远程接口

get请求 参数拼接在url &#xff1f;namevalue&sexvalue // httpurlhttp:127.0.0.1/project public static String doGet(String httpurl){HttpURLConnection connection nul&#xff1b;Inputstream is null;BufferedReader br null;String result null;//返回结果字…

PHP数据库操作实例 - 学生信息管理

文章目录 一、启动Apache与MySQL服务二、创建数据库与表(一)创建数据库(二)创建表并插入记录三、项目实现步骤(一)创建项目(二)创建学生类(二)获取数据库连接(三)学生数据访问对象(四)创建功能页面1、按学号查询学生页面2、处理按学号查找学生记录页面3、插入学生…

VMware提示:此虚拟机似乎正在使用中,取得该虚拟机的所有权失败错误的解决方案

当你遇到这个的时候是不是很疑惑&#xff0c;现在给你解决方案 step1: 先找到配置文件目录 D:\centOs7_mini\ 这里写成你的这个 step2: 在这个地方查找最后面是 .vmx.lck文件夹,然后进行修改、删除、移动都可以 step3: 去虚拟机那边重新启动就行

RabbitMQ-学习笔记(初识 RabbitMQ)

本篇文章学习于 bilibili黑马 的视频 (狗头保命) 同步通讯 & 异步通讯 (RabbitMQ 的前置知识) 同步通讯&#xff1a;类似打电话&#xff0c;只有对方接受了你发起的请求,双方才能进行通讯, 同一时刻你只能跟一个人打视频电话。异步通讯&#xff1a;类似发信息&#xff0c…