Я реализовал повтор для моего Alamofire
запроса как RequestInterceptor
. Я получаю коды ошибок Alamofire и отображаю сообщения об ошибках на основе кода ошибки.
Но если повторная попытка не удалась, возвращается:
requestRetryFailed(retryError: Alamofire.AFError.responseValidationFailed(reason: Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: 401)), originalError: Alamofire.AFError.responseValidationFailed(reason: Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: 401)))
И я не могу получить доступ к коду ошибки, потому что это ноль , Для сценария успеха я могу получить доступ к коду ошибки:
let errorCode = error.asAFError?.responseCode
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
guard let response = request.task?.response as? HTTPURLResponse else {
return completion(.doNotRetryWithError(error))
}
if (response.statusCode == 403 || response.statusCode == 401) && self.numberOfRetries < 1 {
self.numberOfRetries += 1
self.refreshToken(session: session, router: LoginRouter.refreshToken) {(result: Result<LoginModel, Error>) in
switch result {
case .success(let result):
self.saveRefreshToken(result)
completion(.retryWithDelay(0.3))
case .failure(let error):
completion(.doNotRetryWithError(error))
}
}
}else {
completion(.doNotRetryWithError(error))
}
}