【问题标题】:Alamofire and PromiseKit returning a Promise<[T]>Alamofire 和 PromiseKit 返回一个 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)")

            }
        }

    }
}

【问题讨论】:

    标签: swift alamofire promisekit


    【解决方案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 附近的值没有字符串键。}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2016-11-21
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2020-08-06
    相关资源
    最近更新 更多