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>

While Loop 在 Promisekit 完成运行并在 Swift 中返回正确的值之前递增并重新运行

PromiseKit 3.0:用循环链接