0

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

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

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

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

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

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

4

1 回答 1

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()
}
于 2015-11-22T02:37:31.743 回答