Alamofire: как повторить запрос только один раз

Я усыновляю RequestAdapter а также RequestRetrier автоматически добавлять поведение маркера обновления в мой запрос. Проблемы, которые повторяются, возникают бесконечно без контроля. У меня есть этот код:

class AuthHandler: RequestAdapter, RequestRetrier {

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {

        return urlRequest

    }

    public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {

        if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {

            _ = Credential.current.renew({ (credential, error) in
                completion(true, 0.0) /// Retry request
            })

        } else {

            completion(false, 0.0) // Don't retry

        }

    }

}

Как я могу повторить запрос только один раз после сбоя?

Я попробовал это:

request.retryCount = 1

но не работает... Есть идеи?

Спасибо!

1 ответ

Решение

retryCount только для чтения. Описание для retryCount является:

Сколько раз запрос был повторен.

Итак, все, что вам нужно сделать, это проверить этот счетчик повторений и прекратить повторные попытки, если retryCount слишком высоко

Чтобы остановить после одной попытки, этот код будет работать:

class AuthHandler: RequestAdapter, RequestRetrier {

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
        return urlRequest
    }

    public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {

        guard request.retryCount == 0 else { return completion(false, 0) } // relevant change

        if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {

            _ = Credential.current.renew({ (credential, error) in
                completion(true, 0) /// Retry request
            })

        } else {
            completion(false, 0.0) // Don't retry
        }
    }
}

Примечание. При первой попытке запроса его retryCount равно 0. В нашем коде выше мы проверяем, что это только при первой же попытке, где retryCount == 0,

Другие вопросы по тегам