之前使用 responseJSON 来进行网络工作的, 可是即将迎来废弃
@available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.")
首先需要安装2 个基础工具库
pod 'Alamofire', '5.6.4'
pod 'CodableWrapper'
其中 使用Alamofire 完成基础的数据请求, 使用 CodableWrapper 处理模型默认值的情况
本篇处理数据为数组以及字典两种情况
[{"id": 238162807,
"node_id": "MDEwOlJlcG9zaXRvcnkyMzgxNjI4MDc=",
"name": "api",
"full_name": "mosn/api",
"private": false,
"homepage": null}]
{
"full_name": "mosn/api"
}
首先定义一个基础协议遵循 Codable
import Foundation
/// 基础模型协议
public protocol XTProtocol: Codable {
}
然后让模型结构体遵循基础协议并把属性赋值默认值, 使用 @Codec语法糖
其中多层数据也可完成解析
import Foundation
import CodableWrapper
struct XTRepoModel: XTProtocol {
@Codec
var full_name: String = ""
}
struct XTOwnerModel: XTProtocol {
@Codec
var type: String = "summerxx"
}
struct XTRepoListModel: XTProtocol {
@Codec
var name: String = ""
@Codec
var full_name: String = ""
@Codec
var id: Int = 0
@Codec
var `private`: Bool = true
/// null
@Codec
var homepage: String = "null"
/// 内含对象
var owner: XTOwnerModel?
}
简单封装一个网络类, 因为比较简单命名为 JDNetwork
import Foundation
import Alamofire
open class JDNetwork: NSObject {
}
extension JDNetwork {
/// 简单的 get 请求
/// - Parameters:
/// - url: 网址
/// - params: 参数
/// - type: 如果结果是 dict 直接用Model.self, 如果是 array 使用 [Model].self
/// - success: 成功
/// - failure: 失败
public static func get<T: Decodable>(
_ url: String,
params: [String: Any]?,
of type: T.Type = T.self,
success: @escaping (T) -> Void,
failure: @escaping (NetworkError) -> Void
) {
AF.request(url, method: .get, headers: HTTPHeaders(AppInfo.shared.baseHeaders())).responseDecodable(of: type) { response in
if (response.error != nil) {
failure(response.error!)
} else {
guard let data = response.value else {
return
}
success(data)
}
}
}
}
使用的时候
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
JDNetwork.get("https://api.github.com/repos/mosn/mosn", params: nil, of: XTRepoModel.self) { res in
print("对象数据类型 \nfull_name = \(res.full_name)")
} failure: { error in
print(error)
}
JDNetwork.get("https://api.github.com/users/mosn/repos", params: nil, of: [XTRepoListModel].self) { res in
print("数组数据类型")
res.forEach { obj in
print(obj.name)
print(obj.full_name)
print(obj.id)
print(obj.private)
print(obj.homepage)
print("\n")
}
} failure: { error in
print(error)
}
}
}
看下效果, 就已经实现了, 获取数据转成模型的情况, 实际产生作用的代码很少, 很便捷, 解析已经完成, 把 null 的情况也处理好了
图
但是实际我们在移动端 App里面, 对于网络还有很多问题需要考虑, 肯定不能像上面那样简单, 而且还要适配本公司的一些特性
举几个🌰
基础基建层面
编码时对 JSON 按照 key 进行排序
网络管理类, 监听网络状态的封装
网络拦截器
网络错误状态的封装
网络任务的控制: 比如取消, 继续, 是否结束等
再上一层
比如 app 的环境(test, dev, regress等等), baseUrl
请求头的包装
拦截器的定义
错误码统一处理等
依照上面的一些思路 我也实现了一套比较完整的网络封装, 代码还是比较多的 , 感兴趣的直接看 demo 吧, 运行 demo 前需要申请个 github token, 方便查看效果.
依照惯例 demo 请看这里
https://github.com/summerxx27/XTAlamofire
网友评论