最近打算自己写个项目练练手,在弄到网络请求这块,发现之前用的都不是特别好用,于是想着还是自己手动封装一下,于是如下:
所用的第三方库:

pod 'Moya'
pod 'Reachability'
pod 'MBProgressHUD'
pod 'HandyJSON'
pod 'Result'


对于moya用法大家参照官方文档我就直接cv了,如下:
新建类NetManager

//
//  NetManager.swift
//
//
//  Created by  on 2022/4/12.
//import Moya
import MBProgressHUD
import HandyJSON
import Result
import CWLog//MARK: loading插件,组合API请求,可在请求中自动补充loading
let LoadingPlugin = NetworkActivityPlugin { (type, target) in
//    guard let vc = topVC else {return}switch type {case .began: breakcase .ended: break}}//MARK: 超时中间件
let timeoutClosure = {(endpoint: Endpoint, closure: MoyaProvider<NetManager>.RequestResultClosure) -> Void inif var urlRequest = try? endpoint.urlRequest() {urlRequest.timeoutInterval = 20closure(.success(urlRequest))} else {closure(.failure(MoyaError.requestMapping(endpoint.url)))}
}//MARK: 无loading请求
let ApiProvider = MoyaProvider<NetManager>(requestClosure: timeoutClosure)
//MARK: 有loading请求
let ApiLoadingProvider = MoyaProvider<NetManager>(requestClosure: timeoutClosure, plugins: [LoadingPlugin])enum NetManager {case Recommend(device_id: String, model: String,sTime: String,systemVersion: String, target: String, time: String, version: String)case searchHot//搜索热门}extension NetManager: TargetType {var path: String {switch self {case .Recommend:return "/Recommend/head"case .searchHot:return "search/hotkeywordsnew"}}var method: Moya.Method {return .get}var task: Task {var paramters: [String : Any] = [:]switch self {case .Recommend(let device_id, let model, let sTime, let systemVersion, let target, let time, let version):paramters["device_id"] = device_idparamters["model"] = modelparamters["sTime"] = sTimeparamters["systemVersion"] = systemVersionparamters["target"] = targetparamters["time"] = timeparamters["version"] = versiondefault:break}return .requestParameters(parameters: paramters, encoding: URLEncoding.default)}var sampleData: Data { return "".data(using: String.Encoding.utf8)! }var headers: [String : String]? {return nil}var baseURL: URL {return URL(string: "https://app.u17.com/v3/appV3_3/ios/phone")!}}//MARK: 请求结果解析模型
extension Response {func mapModel<T: HandyJSON>(_ type: T.Type)throws -> T {let jsonString = String(data: data, encoding: .utf8)CWLog(jsonString)guard let model = JSONDeserializer<T>.deserializeFrom(json: jsonString) else {throw MoyaError.jsonMapping(self)}return model}
}//MARK: 统一请求封装
extension MoyaProvider {@discardableResultopen func request<T: HandyJSON>(_ target: Target,model: T.Type,completion:((_ returnData: T?) -> Void)?) -> Cancellable? {return request(target) { result indebugPrint(result.value)guard let completion = completion else {return}guard let returnData = try? result.value?.mapModel(ResponseData<T>.self) else {completion(nil)return}completion(returnData.data?.returnData)}}
}

以上就是其实就是moya简单的使用只不过对于请求的结果利用了HandyJSON进行了转化返回的结果直接就是model类型了
其中要注意一下:
所写的model类要按照HandyJSON规则去写如下:

struct QTitleModel : HandyJSON {var title: String? = nilvar type: String? = nilvar tag: String? = nilvar search_hot: String? = nilvar id: String? = nilvar banner_id: String? = nilvar is_recommend: String? = nilvar url: String? = nil
}
extension Array: HandyJSON{}
struct ReturnData<T : HandyJSON>: HandyJSON {var message:String?var returnData: T?var stateCode: Int = 0
}struct ResponseData<T : HandyJSON>: HandyJSON {var code : Int = 0var message: String?var data: ReturnData<T>?
}

其中的RseponseData在NetManager类中已使用,如果模型中有复杂的模型转换,只需将包含的key对用的value值对应为你所写的类即可
例如:数据中包含QTitleModel列表,那可这样写:

struct QTitleList: HandyJSON {var  returnData: [QTitleModel]?
}

使用:

/** 网络请求 */
extension HomeViewController {func loadData() {let device_id = "69EACCA0-47C8-40EE-835F-7C02D8105F93"let model = "iPhone%207%20Plus"let sTime = "1624922081"let systemVersion = "13.3.1"let target = "U17_3.0"let time = "1649726510"let version = "5.8.0"ApiLoadingProvider.request(NetManager.Recommend(device_id: device_id, model: model, sTime: sTime, systemVersion: systemVersion, target: target, time: time, version: version), model: Array<QTitleModel>.self) { returnData inself.titles = returnData!}}
}

简单粗暴!!!

swift网络请求封装(Moya)相关推荐

  1. Swift 网络请求库Moya的使用

    Moya是Swift中的网络库Alamofire的二次封装,Alamofire本身使用起来是很简单方便的,例子如下: func loadData(){var param = [String:Strin ...

  2. Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求

    Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求 转自 http://www.cocoachina.com/ios/20141202/10390.html 本 ...

  3. Swift 网络请求 Moya+RxSwift

    Swift中优雅的网络请求 官方github // 1.定一个enum enum MyService {xxxxcase showUser(id: Int)xxx }// 2.扩展这个enum,符合 ...

  4. 使用 Siesta 处理 Swift 网络请求

    (原文地址:https://medium.freecodecamp.o...) 今天我跟大家分享一下我的 iOS 网络库新欢,名字叫做 Siesta."她有啥特殊的?为啥我不直接用 Almo ...

  5. [译]使用 Siesta 处理 Swift 网络请求

    (原文地址:https://medium.freecodecamp.org/swift-networking-with-siesta-5b5e7089bd8f) 今天我跟大家分享一下我的 iOS 网络 ...

  6. (iOS-框架封装)AFN3.x 网络请求封装

    AFNetworking 我项目里面的网络请求是一外包大牛基于AFN2.x封装的基本网络请求,感觉其封装的贼好,对服务端返回的错误码统一处理,对返回的 json 数据下发给每个继承自基本网络请求的子网 ...

  7. Swift 网络请求数据与解析

    一: Swift 网络数据请求与处理最常用第三方 又有时间出来装天才了,还是在学swift,从中又发现一些问题,这两天上网找博客看问题弄的真的心都累.博客一篇写出来,好多就直接照抄,就没有实质性的把问 ...

  8. 二、Swift网络请求回来的数据我这样取

    网络请求框架Alamofire 源码地址 Swift 2.3 Alamofire3.0版本支持 iOS 8 Swift 3 Alamofire4.0以上版本支持 iOS 9及以上系统 json数据: ...

  9. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...

  10. xUtils3.x的网络请求封装和请求https之单向SSL验证

    很久没写博客了, 自己定的路已经走歪,菜鸟的进阶之路上我只是走了一步,自从发了一篇博客之后在没有来过这里,已经有一年了吧,今天再次回到这里. 言归正传,今天要写的是xUtils3.x网络请求的封装和请 ...

最新文章

  1. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置图例位置、移除图例)实战
  2. IDEA配置SVN并实现代码版本控制
  3. 用grep和cut做一些数据统计
  4. jquery append 动态添加的元素事件on 不起作用的解决方案
  5. Inception Net V1总结
  6. [NOIP2013] 花匠
  7. 利用计算机语言进行并行性描述,有没有一种语言可以利用大规模并行计算机?...
  8. scala代码示例_Scala注释示例
  9. (3.7)存储引擎--索引的结构与分类
  10. AT24C02、DS1302、DS18B20等中文手册
  11. UE4官方文档踩坑:FPS示例2.7 UCameraComponent
  12. 基于Proteus的51单片机仿真
  13. EXFO 收购RF over CPRI 测试方案提供商Absolute Analysis
  14. 复杂句变简单句 java_【SAT写作】简单句如何变为复杂句?10招教你快速转变
  15. 联发科mt8516价格_揭秘联发科MT8516单颗芯片破千万背后的故事
  16. Uboot pmic调试
  17. vue-cli3.0 进行项目的部署和构建
  18. SolidWorks+thonny esp32 电磁控制,程序算法搞起来了,我的结构-仿真-电磁-控制-算法的学习之路
  19. 企业对接钉钉流程(企业内部应用-H5)
  20. 云端搭建linux学习环境——手把手教学,赶紧收藏以后使用

热门文章

  1. 03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序
  2. subscript下标
  3. 浏览器主页被修改的解决方案
  4. java 释放锁_Java并发编程:锁的释放
  5. (五十七)方差分析与相关分析
  6. refresh是什么?Spring refresh的12个步骤
  7. android如何增加北斗定位,安卓手机怎么设置北斗导航图文教程
  8. 社团联合会计算机教程,计算机与信息工程学院学生社团联合会
  9. 尚品宅配、欧派激战整装市场
  10. 基于低代码为企事业单位打造督办事务管理一体化协同管控平台