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)
我想为所有请求创建一个通用方法。在我的代码中,我做了承诺类型 List
和JSONDecoder().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 -> 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