【问题标题】:Chaining promises in Alamofire using Promisekit使用 Promisekit 在 Alamofire 中链接承诺
【发布时间】:2016-02-08 05:54:16
【问题描述】:

我认为这是一个非常常见的用例,但我找不到任何最好的方法来实现它。

我的 ios 应用程序的某些部分需要登录。如何使用 Alamofire 和 swift 实现以下模式。

.request (.GET 'login_required_endpoint')
      .responsejson(if statusCode == 401){
                login()
                continue with GETing
                      login_required_endpoint

实现这一目标的最佳方法是什么。

  • 提出请求
  • 如果服务器响应 401(未授权)
  • 保存之前请求的所有请求负载后要求用户登录
  • 成功登录后,继续执行 [1] 中的请求并保存有效负载

(我知道它是开放式的,但是对于如何取得进展的任何帮助将不胜感激)

【问题讨论】:

    标签: swift alamofire promisekit


    【解决方案1】:

    通过以下方式,您可以致电handleRequest 而不是Alamofire 的请求

    import Alamofire
    import PromiseKit
    
    enum ServerError: ErrorType {
        case Unauthorized
        // add others as necessary
    }
    
    func handleRequest(method: Alamofire.Method, _ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil) -> Promise<AnyObject> {
        return request(method, URLString, parameters: parameters).recover { error -> AnyObject in
            switch error {
            case ServerError.Unauthorized:
                return login().then {
                    request(method, URLString, parameters: parameters)
                }
            default:
                throw error
            }
        }
    }
    
    private func request(method: Alamofire.Method, _ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil) -> Promise<AnyObject> {
        return Promise { fulfill, reject in
            Alamofire.request(method, URLString, parameters: parameters).responseJSON { response in
                switch response.result {
                case .Success(let json):
                    fulfill(json)
                case .Failure(let error):
                    if response.response?.statusCode == 401 {
                        reject(ServerError.Unauthorized)
                    }
                    else {
                        reject(error)
                    }
                }
            }
        }
    }
    
    private func login() -> Promise<Void> {
        // do what you need here...
        return Promise()
    }
    

    【讨论】:

    • 感谢您的回答。如何确保流程支持用户多次输入错误的凭据。看起来您的解决方案只支持一次正确的尝试。
    • 嗯...如果handleRequest 返回一个 .Unauthorized 错误,那么我会向用户显示一个警报。如果用户想再试一次,(s)他只需要重复导致登录出现在首位的操作。
    • 否则,我建议你发布另一个问题,如果它出错了如何重试一个承诺。
    • 谢谢!关于您的解决方案的问题。 ` return login().then { request(method, URLString, parameters: parameters) }` 调用 handleRequest().then() 的客户端抛出了一个错误,上面写着 Could not cast value of type 'PromiseKit.Promise&lt;Swift.AnyObject&gt;' to 'TaskSolver.Task' (0x1042562d0). 不确定如何调试它。任何帮助将不胜感激
    • 试试return login().then { () -&gt; Promise&lt;Void&gt; in request(...让系统知道它正在处理什么类型。
    猜你喜欢
    • 2015-12-14
    • 2016-01-06
    • 2015-10-10
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多