0

これはかなり一般的なユースケースだと思いますが、それを達成するための最良の方法が見つかりませんでした。

iOS アプリケーションの一部でログインが必要です。Alamofire と Swift を使用して次のパターンを実現するにはどうすればよいですか。

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

これを達成するための最良の方法は何ですか。

  • リクエストをする
  • サーバーが 401(Unauthorized) で応答する場合
  • 前のリクエストのすべてのリクエスト ペイロードを保存した後、ユーザーにログインを求める
  • ログインに成功したら、ペイロードを保存して [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 に答える