使用Promisekit在Alamofire中链接承诺

时间:2015-11-07 00:34:49

标签: swift alamofire promisekit

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

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

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

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

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

(我知道它是开放式的,但是如何取得进展的任何帮助都将受到高度赞赏)

1 个答案:

答案 0 :(得分:2)

使用以下内容,您可以拨打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()
}