Alamofire:如何只重试一次请求

Alamofire: How to retry request only once

我正在采用 RequestAdapterRequestRetrier 将刷新令牌行为自动添加到我的请求中。 无限重试的问题无法控制。 我有这个代码:

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

但不起作用...有什么想法吗?

谢谢!

retryCount 是只读的。 retryCount 的描述是:

The number of times the request has been retried.

因此,您需要做的就是检查此重试次数,如果 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.