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

Alamofire and PromiseKit returning a Promise<[T]>

我使用 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)")

            }
        }

    }
}

是不是应该这样,

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,这就是您的错误所说的。然后,当承诺执行完成时,您可能希望使用 [Actor] 类型的结果解决您的承诺,或者如果在执行过程中发生错误,则拒绝错误。

这里有几点要注意:

  • Alamofire.request(_).responseJSON returns 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)")
    }