zoukankan      html  css  js  c++  java
  • 自定义 Alamofire 的 response serializer

    Alamofire 的 DataRequest 类针对二进制数据、字符串、json、属性列表提供了一系列方便解析的方法(内部实际上使用的是 Response Serializer),现在我们要针对服务端返回的数据格式定义我们自己的 Response Serializer。

    假设服务器返回的数据格式是这样的:

    {
        "code": 0,
        "datas": {
            "name": "Jack",
            "age": 13
        },
        "message": ""
    }
    

    其中 datas、message 对应的数据可能为空,我们来针对这个格式定义 Response Serializer。

    从二进制数据到数据模型,直接使用 Swift 4 内置的 JSONDecoder 进行解析,所以,定义的模型需要遵从 Decodable 协议(下面的代码,我为了偷懒直接写了 Codable)。

    struct Response<T: Codable>: Codable {
        let code: Int
        let datas: T?
        let message: String?
    }
    
    struct Person: Codable {
        let name: String
        let age: Int
    }
    
    extension DataRequest {
        static func customResponseSerializer<T: Codable>(type: T.Type) -> DataResponseSerializer<T> {
            return DataResponseSerializer(serializeResponse: { (request, response, data, error) -> Result<T> in
                guard error == nil else {
                    return .failure(error!)
                }
                let result = Request.serializeResponseData(response: response, data: data, error: nil)
                switch result {
                case .success(let validData):
                    do {
                        let entity = try JSONDecoder().decode(T.self, from: validData)
                        return .success(entity)
                    } catch {
                        return .failure(error)
                    }
                case .failure(let error):
                    return .failure(error)
                }
            })
        }
    
        @discardableResult
        func responseCustomObject<T: Codable>(queue: DispatchQueue? = nil,
                                    type: T.Type,
                                    completion: @escaping (DataResponse<T>) -> Void) -> Self {
            return response(queue: queue, responseSerializer: Alamofire.DataRequest.customResponseSerializer(type: type), completionHandler: completion)
        }
    }
    

    使用的时候,这样就好了:

    Alamofire.request("http://mall.cnrmall.com/api/app/version_check").responseCustomObject(type: Response<VersionInfo>.self) { (response) in
        switch response.result {
        case .success(let value):
            print(value)
        case .failure(let error):
            print("error: (error.localizedDescription)")
        }
    }
    
  • 相关阅读:
    滑动窗口与选择搜索
    R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD, R-FCN系列深度学习检测方法梳理
    GD和SGD区别
    AlexNet、VGG、NIN、GoogLeNet、ResNet
    目标检测中的precision,recall,AP,mAP计算详解
    转:图像分类、物体检测、物体分割、实例分割、语义分割
    卷积网络CNN中各种常见卷积过程
    卷积网络中的通道(Channel)和特征图
    人工智能之卷积神经网络(CNN)
    科技文献检索(一)——课程介绍及信息素养
  • 原文地址:https://www.cnblogs.com/xjshi/p/10683979.html
Copyright © 2011-2022 走看看