0


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

  1. Moya

是一个流行的 Swift 网络抽象层,被用于简化 iOS 应用程序中的网络请求。使用

  1. Moya

,可以定义网络请求的方式,增加类型安全性,因为所有的网络请求都是经过 Swift 类型系统检查的,并且

  1. Moya

提供了一种很好的方式来将网络请求代码组织得更加清晰和可维护。

  1. Moya

的核心是一个

  1. TargetType

协议,它定义了一个 API 端点的所有必要信息,包括路径、方法、任务、HTTP 任务和可能的测试数据。开发者需要为所消费的每一个 API 端点创建一个符合

  1. TargetType

协议的枚举 case。
官网:https://github.com/Moya/Moya/blob/master/Readme_CN.md

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

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

2.定义网络通用模型

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

  1. {
  2. code:200,
  3. message:"成功",
  4. data:{}
  5. }

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

  1. import HandyJSON
  2. // 通用网络请求模型
  3. struct BaseDetailResponse<T: HandyJSON>: HandyJSON {
  4. var code: Int?
  5. var message: String?
  6. var data: T?
  7. }

3. 定义一个

  1. TargetType

协议的枚举

  1. import Moya
  2. enum RequestApi {
  3. //获取会议信息
  4. case getMeetingroom(meetingNum:Int)
  5. }
  6. // MARK: - 实现TargetType协议
  7. extension RequestApi:TargetType{
  8. var sampleData: Data {
  9. switch self {
  10. case .getMeetingroom:
  11. return "{\"token\": \"sample token\"}".data(using: .utf8)!
  12. // 其他 API 请求的测试数据...
  13. case .getCaptions:
  14. return "{\"token\": \"sample token\"}".data(using: .utf8)!
  15. }
  16. }
  17. var baseURL: URL {
  18. let url = "域名"
  19. return URL(string: url)!
  20. }
  21. // 返回每个请求的路径
  22. var path: String {
  23. switch self{
  24. case .getMeetingroom:
  25. return "xx/xx"
  26. default:
  27. fatalError("Request path is null")
  28. }
  29. }
  30. var method: Moya.Method {
  31. switch self{
  32. case .getMeetingroom:
  33. return .post
  34. default:
  35. return.get
  36. }
  37. }
  38. var task: Moya.Task {
  39. switch self{
  40. case .getMeetingroom(let meetingNum):
  41. // 用于编码成x-www-form-urlencoded的参数
  42. let params: [String: Any] = ["meetingNum": meetingNum]
  43. return .requestParameters(parameters: params, encoding: URLEncoding.default)
  44. default:
  45. //不传递任何参数
  46. return .requestPlain
  47. }
  48. }
  49. /// 请求头
  50. var headers: [String : String]? {
  51. var headers:Dictionary<String,String> = [:]
  52. //内容的类型
  53. switch self{
  54. case .getMeetingroom:
  55. headers["Content-Type"]="application/x-www-form-urlencoded"
  56. break
  57. default:
  58. break
  59. }
  60. return headers
  61. }
  62. }

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

若getMeetingroom返回数据结构为

  1. {
  2. meetingNum:4234234234,
  3. meetingName:"会议"
  4. }

定义会议信息结构体

  1. struct MeetingInfo: HandyJSON {
  2. var meetingNum:Int
  3. var meetingName:String
  4. init() {
  5. self.meetingNum = 0
  6. self.meetingName = ""
  7. }
  8. }

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

使用

  1. MoyaProvider

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

  1. //
  2. // DoRequest.swift
  3. //
  4. import Foundation
  5. import Moya
  6. import RxSwift
  7. import HandyJSON
  8. class DoRequest{
  9. static let shared = DoRequest()
  10. private var provider:MoyaProvider<RequestApi>!
  11. // MARK:
  12. func getMeetingroom(data:Int, completion: @escaping (BaseDetailResponse<MeetingInfo>?, Error?) -> ()) {
  13. provider.request(.getMeetingroom(meetingNum: data)){ result in
  14. switch result {
  15. case let .success(response):
  16. if let jsonResponse = BaseDetailResponse<MeetingInfo>.deserialize(from: String(data: response.data, encoding: .utf8)) {
  17. completion(jsonResponse, nil)
  18. } else {
  19. print("Decoding Error")
  20. completion(nil, DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "Decoding error")))
  21. }
  22. case let .failure(error):
  23. print(error.errorDescription ?? "error")
  24. completion(nil, error)
  25. }
  26. }
  27. }
  28. /// 私有构造方法 主要为了打印后台请求到的数据 便于查看
  29. private init() {
  30. //网络请求加载对话框
  31. let networkActivityPlugin = NetworkActivityPlugin { change, target in
  32. //changeType类型是NetworkActivityChangeType
  33. //通过它能监听到开始请求和结束请求 //targetType类型是TargetType
  34. //就是我们这里的service //通过它能判断是那个请求
  35. if change == .began {
  36. //开始请求
  37. let targetType = target as! RequestApi
  38. switch targetType {
  39. case .getMeetingroom:
  40. DispatchQueue.main.async {
  41. //切换到主线程 才可以操作view
  42. }
  43. default:
  44. break
  45. }
  46. } else {
  47. //结束请求
  48. DispatchQueue.main.async {
  49. }
  50. }
  51. }
  52. plugins.append(networkActivityPlugin)
  53. provider = MoyaProvider<RequestApi>(plugins: plugins)
  54. }
  55. }

5. 使用示例

  1. let intValue = Int("4234234234")!
  2. let meetingInfo = MeetingInfo()
  3. DoRequest.shared.getMeetingroom(data: intValue) { (response, error) in
  4. if let response = response {
  5. if let code = response.code{
  6. if(code == 200){
  7. // 处理你的响应
  8. if let data = response.data {
  9. // Use meetingRoomInfo here
  10. meetingInfo = data
  11. }
  12. }else{
  13. self.alertMessage = response.message!
  14. self.showAlert = true
  15. }
  16. }
  17. } else if let error = error {
  18. //登录失败
  19. self.showAlert = true
  20. self.alertMessage = error.localizedDescription
  21. return
  22. }
  23. }
标签: swiftui ios swift

本文转载自: https://blog.csdn.net/SHUIYI_24/article/details/134846856
版权归原作者 丝月 所有, 如有侵权,请联系我们删除。

“iOS(swiftui)——网络连接(Moya)”的评论:

还没有评论