代码之家  ›  专栏  ›  技术社区  ›  Damodar

Alamofire Promise生成通用请求方法

  •  2
  • Damodar  · 技术社区  · 7 年前

    我正在尝试实现一个通用方法,该方法用于从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)
                }
            }
        }
    }
    

    我想为所有请求创建一个通用方法。在我的代码中,我将承诺类型 列表 JSONDecoder().decode(List.self) ,我想在这里 列表 键入dynamic。我们怎样才能做到这一点?我想重复使用 asyncGetRequest 用于所有API调用的方法。我想传递请求URL( 获取专业知识 )以及 列表 类类型为动态。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ivan Smetanin    7 年前

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

    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)
                }
            }
        }
    }
    
        2
  •  0
  •   Anthony    4 年前
    • 阿拉莫菲尔(5.2.2)
    • 承诺书(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)
              }
            }
        }
      }
    }