【问题标题】:Alamofire Promise make generic request methodAlamofire Promise 制作通用请求方法
【发布时间】:2018-04-29 13:07:13
【问题描述】:

我正在尝试实现一个通用方法,用于从 API 调用中获取数据。

这是我的代码。

 class Http {
       class func asyncGetRequest()->Promise<List> {
        return Promise {
            resolve in
            Alamofire.request(GET_PROFFESSIONAL).responseData().done { response in
                guard let blog = try? JSONDecoder().decode(List.self, from: response.data) else {
                    let error = MyError(message: "Error: Couldn't decode")
                    resolve.reject(error)
                    return
                }
                    resolve.fulfill(blog as List)
                }.ensure {

                }.catch { error in
                    resolve.reject(error)
            }
        }
    }
}

我想为所有请求创建一个通用方法。在我的代码中,我做了承诺类型 ListJSONDecoder().decode(List.self),在这里我想让 List 类型动态化。我们怎么能做到这一点?我想为所有 API 调用重用 asyncGetRequest 方法。我想将请求 URL (GET_PROFFESSIONAL) 和 List 类类型作为动态传递。

【问题讨论】:

    标签: swift xcode generics alamofire


    【解决方案1】:

    您可以使用泛型并编写如下内容:

    class Http {
        class func asyncGetRequest<ListType: Decodable>() -> Promise<ListType> {
            return Promise { resolve in
                Alamofire.request(GET_PROFFESSIONAL).responseData().done { response in
                    guard let blog = try? JSONDecoder().decode(ListType.self, from: response.data) else {
                        let error = MyError(message: "Error: Couldn't decode")
                        resolve.reject(error)
                        return
                    }
                        resolve.fulfill(blog as ListType)
                    }.ensure {
    
                    }.catch { error in
                        resolve.reject(error)
                }
            }
        }
    }
    

    【讨论】:

    • @EvilCoder 没问题!你可以投票给我的答案:)
    • 当使用上述方法获取零数据时。 '让 listData: Promise = self.asyncGetRequest() print(listData.value)'
    • 如何从该承诺值访问列表数据
    • let list = self.asyncGetRequest().value?.then { data -> Void in return data } // 错误 无法推断通用参数“ListType”
    • @EvilCoder 你可以尝试指定你的列表类型吗?我的意思是这样的:let list: YourListType = self.asyncGetRequest().value?.then { data -&gt; Void in return data }
    【解决方案2】:
    • Alamofire (5.2.2)
    • PromiseKit (6.13.1)
    struct Network {
      static func get<Mode: Codable>(url: String) -> Promise<Mode> {
        return Promise { seal in
          AF.request(url, method: .get, encoding: URLEncoding.default, headers: nil)
            .response { response in
              
              if let error = response.error {
                seal.reject(error)
                return
              }
              
              guard let data = response.data else { return }
              
              do {
                let items = try JSONDecoder().decode(Mode.self, from: data)
                seal.resolve(items, nil)
              } catch {
                seal.reject(error)
              }
            }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2017-05-11
      • 2018-07-13
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多