Alamofire Promise 制作通用请求方法

Posted

技术标签:

【中文标题】Alamofire Promise 制作通用请求方法【英文标题】:Alamofire Promise make generic request method 【发布时间】: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 类类型作为动态传递。

【问题讨论】:

【参考方案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)
          
        
    
  

【讨论】:

以上是关于Alamofire Promise 制作通用请求方法的主要内容,如果未能解决你的问题,请参考以下文章

从 PromiseKit/Alamofire 返回一个 Promise

Swift AlamoFire 5 不会执行请求

Alamofire 和 PromiseKit 返回一个 Promise<[T]>

多个网站的多个 Alamofire 请求的正确模型

Moya/Alamofire 请求变量问题

Promise 用法