【问题标题】:Generic network call with Alamofire and ObjectMapper使用 Alamofire 和 ObjectMapper 进行通用网络调用
【发布时间】:2019-05-11 09:48:34
【问题描述】:

我正在使用 Alamofire 和 Alamofire Object Mapper 发出网络请求并对其进行序列化。我们总是得到与以下示例相同的响应形状,包括结果、isSuccessfull 和消息。

{
    "Result": {
        "WaitingCount": 0,
        "ApprovedCount": 0,
        "RejectedCount": 0
    },
    "IsSuccessfull": true,
    "Message": null
}

我创建了一个基类来防止代码与以下代码重复。

    struct BaseObjectResponseParser<T:Mappable>: Mappable {
    public var item: T?
    public var isSuccessful:Bool?
    public var message: String?
    init?(map: Map){
    }
    mutating func mapping(map: Map) {
        item <- map["Result"]
        isSuccessful <- map["IsSuccessfull"]
        message <- map["Message"]
    }
}

然后,对于每一个不同的模型,我创建了一个模型类,如下所示。

class UnitWorkOrdersCount: Mappable {
    var waitingCount: Int = 0
    var approvedCount: Int = 0
    var rejectedCount: Int = 0

    required init?(map: Map) {
    }

    func mapping(map: Map) {
        waitingCount <- map["WaitingCount"]
        approvedCount <- map["ApprovedCount"]
        rejectedCount <- map["RejectedCount"]
    }    
}

我正在使用以下代码 sn-p 从服务器进行网络调用并序列化响应。

typealias HandlerGetUnitWorkOrdersCount = (UnitWorkOrdersCount?, _ message: String?) -> ()
func getUnitWorkOrdersCount(by identifier: Int, handler: @escaping HandlerGetUnitWorkOrdersCount) {
    let parameters: Parameters = ["identifier": identifier]
    Alamofire.request(URL_GET_UNIT_WORK_ORDER_COUNT, method: .get, parameters: parameters).responseObject { (response: DataResponse<BaseObjectResponseParser<UnitWorkOrdersCount>>) in
        switch response.result {
        case .success:
            if let result = response.result.value {
                if result.isSuccessful ?? false {
                    handler(result.item, nil)
                } else {
                    handler(nil, result.message)
                }
            }
        case .failure(let error):
            print(error)
            handler(nil, error.localizedDescription)
        }
    }
}

但是,我有很多网络请求,并且我的代码与上面的代码重复。我试图使它通用,但我无法成功。如何使 networkRequest 函数和我的完成处理程序通用并防止其重复?

【问题讨论】:

    标签: swift alamofire objectmapper


    【解决方案1】:

    您可以尝试如下使其通用,

    class MyService {
    
        public static func request<T: Mappable>(_ urlString: String,
                                                method: HTTPMethod,
                                                params: Parameters?,
                                                type: T.Type,
                                                completion: @escaping (T?, String?) -> Void) {
    
            Alamofire.request(urlString, method: method, parameters: params).responseObject { (response: DataResponse<BaseObjectResponseParser<T>>) in
                switch response.result {
                case .success:
                    if let result = response.result.value {
                        if result.isSuccessful ?? false {
                            completion(result.item, nil)
                        } else {
                            completion(nil, result.message)
                        }
                    }
                case .failure(let error):
                    completion(nil, error.localizedDescription)
                }
            }
        }
    }
    

    用法

    MyService.request("urlPathString", method: .get, params: nil,
                      type: UnitWorkOrdersCount.self) { (unitWork, message) in
                        if let message = message {
                            print(message)
                            return
                        }
                        print(unitWork!.waitingCount)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2012-08-17
      • 2016-07-28
      • 2012-07-26
      • 2017-06-03
      • 2018-02-18
      相关资源
      最近更新 更多