美文网首页
swift 基于 Alamofire 的 responseDec

swift 基于 Alamofire 的 responseDec

作者: 夏天然后 | 来源:发表于2023-02-19 18:38 被阅读0次

之前使用 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

相关文章

网友评论

      本文标题:swift 基于 Alamofire 的 responseDec

      本文链接:https://www.haomeiwen.com/subject/cdaikdtx.html