Alamofire 和 PromiseKit 返回一个 Promise<[T]>
Posted
技术标签:
【中文标题】Alamofire 和 PromiseKit 返回一个 Promise<[T]>【英文标题】:Alamofire and PromiseKit returning a Promise<[T]> 【发布时间】:2018-04-02 18:51:48 【问题描述】:我使用 Alamofire 和 PromiseKit 作为单独的 Cocoapod 安装。我可以使用 Alamofire 检索 JSON 数据,但是在配置 PromiseKit 时收到以下错误。下面的错误出现在 'fulfill, reject' 所在的行中。
错误消息:上下文闭包类型 '(Resolver<_>) -> Void' 需要 1 个参数,但在闭包主体中使用了 2 个
我在模拟器中使用 Xcode 9.2 和 ios 11.2。提前感谢您的建议!
func wantToReturnAnArrayOfActor() -> Promise<[Actor]>
return Promise fulfill, reject in
Alamofire.request(ApiUrl.url.rawValue).responseJSON (response) in
switch(response.result)
case .success(let responseString): print("my response string = \(responseString)")
let actorResponse = ActorApiResponse(JSONString: "\(responseString)")//converts all of the data into the ActorApiResponse model class
return when(fulfilled: actorResponse)
DispatchQueue.main.async
print("actorResponse = \(String(describing: actorResponse))")
case .failure(let error): print("alamofire error = \(error)")
【问题讨论】:
【参考方案1】:是不是应该这样,
func wantToReturnAnArrayOfActor() -> Promise<[Actor]>
return Promise() resolver in
Alamofire.request(ApiUrl.url.rawValue).responseJSON (response) in
switch(response.result)
case .success(let responseObject):
let actorResponse = ActorApiResponse(jsonObject: responseObject)
let actors = actorResponse.getActors()
resolver.fulfill(actors)
case .failure(let error):
resolver.reject(error)
Promise 的初始化闭包接受单个参数,它是 Resolver 类型的,这就是你的错误所说的。然后,您可能希望在 Promise 执行完成时使用类型为 [Actor] 的结果来解决您的 Promise,或者如果在执行期间发生错误则以错误方式拒绝。
这里有几点需要注意:
Alamofire.request(_).responseJSON 返回 json 对象而不是 json 字符串。 如果您的 ActorApiResponse 是将 json 转换为 [Actor] 的对象,您应该有适当的方法将 json 对象转换为实际数据类型,即。 [演员]。你可以让你的 ActorApiResponse 像这样,
struct ActorApiResponse
init(jsonObject: Any)
func getActors() -> [Actor]
// calculate and return actors
return []
然后,你可以从其他地方调用它,
wantToReturnAnArrayOfActor().done
// do something with [Actor here]
// You can also chain the multiple promise using .then instead of using done
.catch error in
print("Error occurred \(error)")
【讨论】:
桑迪普,非常感谢您的回复!我正在使用 ObjectMapper 将 JSON 数据与我的模型相关联。我可以通过 print() 查看数据,但收到此错误:Error Domain=NSCocoaErrorDomain Code=3840 “No string key for value in object around character 6.” UserInfo=NSDebugDescription=对象中字符 6 附近的值没有字符串键。以上是关于Alamofire 和 PromiseKit 返回一个 Promise<[T]>的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 和 PromiseKit 链接 Alamofire 请求
使用 PromiseKit 和 Alamofire 时跟踪进度
使用 Alamofire 和 PromiseKit 使用 Swift 时出现 Void 错误(请求)
创建基础服务的问题 <Alamofire,PromiseKit,Generic>