使用Objective-C开发的应该非常熟悉AFNetworking这个网络框架。在Swift诞生之后,AFNetworking的作者用Swift来编写一个类似AFNetworking的网络框架,那就是Alamofire!->github.

一直使用Objective-C开发,我来尝试下用Swift进行开发,首先从网络框架入手,对Alamofire进行二次封装。

目前Alamofire的最新版本是5.0.0,还没有5.0的文档 -_-!!!
直接盘它

import UIKit
import Alamofire
import Foundationtypealias FSResponseSuccess = (_ response: String) -> Void
typealias FSResponseFail = (_ error: String) -> Void
typealias FSNetworkStatus = (_ NetworkStatus: Int32) -> Void
typealias FSProgressBlock = (_ progress: Int32) -> Void@objc enum NetworkStatus: Int32 {case unknown          = -1//未知网络case notReachable     = 0//网络无连接case wwan             = 1//2,3,4G网络case wifi             = 2//wifi网络
}class FSNetworkRequest: NSObject {//单例static let share = FSNetworkRequest()private var sessionManager: Session?override init() {super.init()let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 60sessionManager = Session.init(configuration: configuration, delegate: SessionDelegate.init(), serverTrustManager: nil)}///当前网络状态private var mNetworkStatus: NetworkStatus = NetworkStatus.wifipublic func getWith(url: String,params: [String: Any]?,success: @escaping FSResponseSuccess,error: @escaping FSResponseFail) {requestWith(url: url,httpMethod: 0,params: params,success: success,error: error)}public func postWith(url: String,params: [String: Any]?,success: @escaping FSResponseSuccess,error: @escaping FSResponseFail) {//根绝业务需求变动//参数拼接urllet url = FSRequestData.share.getUrlAddParams(params: params, url: url)//数据进行加密let dic = FSRequestData.share.getReqData(params: params)requestWith(url: url,httpMethod: 1,params: dic,success: success,error: error)}public func requestWith(url: String,httpMethod: Int32,params: [String: Any]?,success: @escaping FSResponseSuccess,error: @escaping FSResponseFail) {//getif httpMethod == 0 {manageGet(url: url, params: params, success: success, error: error)} else {managePost(url: url, params: params!, success: success, error: error)}}private func managePost(url: String,params: [String: Any],success: @escaping FSResponseSuccess,error: @escaping FSResponseFail) {//请求头信息var header = HTTPHeaders()header.add(name: "dragon-system", value: FSRequestData.share.getHeaderJson())AF.request(url,method: .post,parameters: params,encoding: URLEncoding.default,headers: header).responseJSON { (response) inswitch response.result {case .success:let json = String(data: response.data!, encoding: String.Encoding.utf8)success(json ?? "")case .failure:let statusCode = response.response?.statusCodeerror("\(statusCode ?? 0)请求失败")debugPrint(response.response as Any)}}}private func manageGet(url: String,params: [String: Any]?,success: @escaping FSResponseSuccess,error: @escaping FSResponseFail) {//请求头信息var header = HTTPHeaders()header.add(name: "dragon-system", value: FSRequestData.share.getHeaderJson())AF.request(url,method: .get,parameters: params,encoding: URLEncoding.default,headers: header).responseJSON { (response) inswitch response.result {case .success:let json = String(data: response.data!, encoding: String.Encoding.utf8)success(json ?? "")case .failure:let statusCode = response.response?.statusCodeerror("\(statusCode ?? 0)请求失败")debugPrint(response.response as Any)}}}/** 上传图片*/public func postImage(url:String,params:Parameters?,fileConfig:FSFileConfig,progressBlock:@escaping FSProgressBlock,success:@escaping FSResponseSuccess,error:@escaping FSResponseFail){var header = HTTPHeaders()header.add(name: "dragon-system", value: FSRequestData.share.getHeaderJson())header.add(name: "content-type", value: "multipart/form-data")let url = FSRequestData.share.getUrlAddParams(params: params, url: url)let dic = FSRequestData.share.getReqData(params: params)// 默认60s超时AF.upload(multipartFormData: { multipartFormData inmultipartFormData.append(fileConfig.fileData, withName: fileConfig.name, fileName: fileConfig.fileName, mimeType: fileConfig.mimeType);if dic.count != 0 {for (key, value) in dic {let str:String = valuelet _datas:Data = str.data(using: String.Encoding.utf8)!multipartFormData.append(_datas, withName: key )}}}, usingThreshold: MultipartFormData.encodingMemoryThreshold,fileManager:.default, to: url, method: .post, headers: header, interceptor: nil).responseJSON { (response) inswitch response.result {case .success:let json = String(data: response.data!, encoding: String.Encoding.utf8)success(json ?? "")case .failure:let statusCode = response.response?.statusCodeerror("\(statusCode ?? 0)请求失败")debugPrint(response.response as Any)}}}
}// MARK: 网络状态相关
extension FSNetworkRequest {///监听网络状态public func detectNetwork(netWorkStatus: @escaping FSNetworkStatus) {let reachability = NetworkReachabilityManager()reachability?.startListening()reachability?.listener = { [weak self] status inguard let weakSelf = self else { return }if reachability?.isReachable ?? false {switch status {case .notReachable:weakSelf.mNetworkStatus = NetworkStatus.notReachablecase .unknown:weakSelf.mNetworkStatus = NetworkStatus.unknowncase .reachable(.wwan):weakSelf.mNetworkStatus = NetworkStatus.wwancase .reachable(.ethernetOrWiFi):weakSelf.mNetworkStatus = NetworkStatus.wifi}} else {weakSelf.mNetworkStatus = NetworkStatus.notReachable}netWorkStatus(weakSelf.mNetworkStatus.rawValue)}}///监听网络状态public func obtainDataFromLocalWhenNetworkUnconnected() {self.detectNetwork { (_) in}}
}class FSFileConfig: NSObject {var fileData : Datavar name : Stringvar fileName : Stringvar mimeType : Stringoverride init() {fileData = Data()name = ""fileName = ""mimeType = ""}func initFile(fileData : Data,name : String,fileName : String,mimeType : String) {self.fileData = fileDataself.name = nameself.fileName = fileNameself.mimeType = mimeType}
}

实例调用,使用HandyJSON进行解析

func getData() {struct BaseModel: HandyJSON {var info : String?var status : Int?var data : DataModel?}struct DataModel: HandyJSON {var header : Any?var video : Any?var list1 : Any?var list2 : Any?var list3 : Any?}self.showLoading()FSNetworkRequest.share.postWith(url: NetworkRequestDefine.URL_index, params: nil, success: { (json) inself.hideLoading()let model = JSONDeserializer<BaseModel>.deserializeFrom(json: json)debugPrint(model!)}) { (response) indebugPrint(response)}}func getData1() {let image = UIImage.init(named: "icon_tabbar_20")var fileConfig = FSFileConfig.init()let data = image?.jpegData(compressionQuality: 0.5)fileConfig.initFile(fileData: data!, name: "img", fileName: "img.jpg", mimeType: "image/jpeg")FSNetworkRequest.share.postImage(url: NetworkRequestDefine.URL_my_uploadimg_index, params: nil,fileConfig: fileConfig, progressBlock: { (progress) in}, success: { (response) in}) { (response) indebugPrint(response)}}

Swift5 Alamofire5.0 二次封装相关推荐

  1. Android Okhttp3 (二) 二次封装请求管理类

    okHttp介绍 通过上面的对比说明,让你不得不做出明智的选择,OkHttp是一个相对成 官网地址:http://square.github.io/okhttp/ 官方API地址:http://m.b ...

  2. C#二次封装虹软人脸识别和人脸比对 2.0版本

    直接看代码,封装成的动态库简练,基本满足日常需求,有需要的可以二次封装.源码: 封装好的的动态库,直接在界面调用.使用步骤: 1.调用动态库并初始化引擎: /// <summary>/// ...

  3. Glide二次封装库的使用

    更多代码可以查询本人GitHub:欢迎阅读,star点起来.  Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支 ...

  4. 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装

    Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...

  5. Android 应用程序集成Google 登录及二次封装

    谷歌登录API:  https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...

  6. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

  7. 微信小程序 对request方法二次封装

    微信小程序跟支付宝小程序都提供了一个发起 HTTPS 网络请求的方法request,那么为了节省一些操作我们有必要对它进行一个二次的封装 1.在app.js里 配置baseUrl // 注册一个小程序 ...

  8. pywinauto二次封装(pywinnat.py)

    将pywinauto常用方法进行封装,使得pywinauto用起来更简单 #头文件的引入 from pywinauto import application from pywinauto import ...

  9. [vue-element] 你有二次封装过ElementUI组件吗?

    [vue-element] 你有二次封装过ElementUI组件吗? popover + button 的组件,点击该按钮后还有个二次确认或选择的交互. InfiniteScroll 封装个简单的带触 ...

最新文章

  1. Tech.ED 2009前瞻:认识System Center
  2. 光纤收发器按照网管怎么分类
  3. 笨办法学 Python · 续 练习 2:创造力
  4. Ubuntu中安装ns3
  5. 158.导出northwind中employees的图像
  6. 微信小程序云数据库中变量作为字段名与字段取值、字段值取值
  7. 苹果Mac安全使用教程:如何使用文件保险箱加密Mac数据
  8. 1到100的和(C)
  9. 如何查看手机上chrome浏览器的console日志打印
  10. 设计模式学习笔记(二十一:访问者模式)
  11. A2 AP AUTOSAR 与 CP AUTOSAR 的特性
  12. c罗说什么语言,C罗会说几种语言? 揭金球奖给梅西内马尔当翻译趣事
  13. linux安装包U盘刻录工具:rufus-3.13.exe
  14. 小程序Android分享朋友圈
  15. 树的结构比图更加严格,那么具体在哪几个点严格呢?
  16. JS计算当前日期的周次
  17. AIGC 语言大模型研究报告
  18. 智慧消防物联网解决方案-智慧消防物联网解决方案开端
  19. 删除除了id号不同,其他都相同的学生冗余信息
  20. 武大 94 年博士年薪 201 万入职华为!学霸日程表曝光,简直降维打击!

热门文章

  1. 比树莓派强 mysql 性能_树莓派Raspberry Pi下MicroSD卡(TF卡)性能跑分对比测评|SanDisk vs 三星...
  2. 2020 CCPC Changchun F :Strange Memory dsu on tree
  3. java jwt刷新_基于springboot+jwt实现刷新token过程解析
  4. 《Linux/UNIX OpenLDAP实战指南》——2.8 OpenLDAP索引
  5. 2019年Java程序员金三银四跳槽季,机会只留给有准备的人!
  6. 教你如何使用SPEC CPU2006
  7. Matlab-计算协方差矩阵函数
  8. 【转载】swf 加密:采用byteArray 方式,增加字符串加密,可加密大文件swf
  9. Android 最简单的自定义MenuItem之一
  10. 石头剪刀布游戏html