Как получить код ошибки из `MoyaError`?

Я использую Moya, Moya_ModelMapper и RxSwift для выполнения сетевых запросов. Вот мой пример кода:

let provider = RxMoyaProvider<MyEndpoint>()
let observable: Observable<RegistrationResponse> = provider.request(.register(firstName: "", lastName: "", email: "", password: "")).mapObject(type: RegistrationResponse.self)
observable.subscribe {
    [weak self] (event: Event<RegistrationResponse>) in
    switch event {
    case .next(let response):
        print(response)
    case .error(let error):
        print(error)
    case .completed:
        break
    }
}

Все работает нормально, но я не знаю, как получить код ошибки, когда я получаю, например, тип ответа с кодом состояния 409 от сервера. Если я напечатаю ошибку, я получу:

jsonMapping(Status Code: 409, Data Length: 0)

но я не знаю, как получить этот код состояния по коду. Ошибка MoyaError, которая является типом Enum. Вот исходный код MoyaError.

Спасибо!


person kamwysoc    schedule 28.01.2017    source источник
comment
error.response.statuscode неужели это так? Поскольку ответ содержит код состояния. И ошибка содержит ответ.   -  person milo526    schedule 28.01.2017
comment
(error as! MoyaError).response?.statusCode работает! Большое спасибо   -  person kamwysoc    schedule 28.01.2017


Ответы (2)


Миграция из комментария

Ошибка Moya не содержит код ошибки напрямую, они содержат ответы MoyaResponse, которые, в свою очередь, содержат код ошибки.

Первый случай ошибка как MoyaError

let moyaError: MoyaError? = error as? MoyaError

Необязательный MoyaError будет содержать необязательный ответ, используя необязательную цепочку, которую мы получаем:

let response : Response? = moyaError?.response

Наконец, мы можем получить ответ с его кодом состояния.

let statusCode : Int? = response?.statusCode
person milo526    schedule 28.01.2017
comment
Ух ты!! Ваш ответ спас мне жизнь... Тысячу раз спасибо!! - person Amadeo Manouchehri; 08.07.2017
comment
У меня ошибка (Time Out), а moyaError.response равно нулю. Как я могу проверить, что это за ошибка? - person oluckyman; 26.07.2018

Для тех, у кого был ответ nil moyaError.response, вот способ получить код ошибки.

 if let error = ((error as? MoyaError)?.errorUserInfo["NSUnderlyingError"] as? Alamofire.AFError)?.underlyingError as? NSError, error.domain == NSURLErrorDomain, error.code == NSURLErrorNotConnectedToInternet || error.code == NSURLErrorTimedOut || error.code == NSURLErrorNetworkConnectionLost {
                   print("not connected")
      }
person Niib Fouda    schedule 17.09.2020