美文网首页
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