Alamofire 重试不适用于 validate()

Alamofire retry doesn't work with validate()

我开始研究 Swift 和 Alamofire。但是我 运行 遇到 RequestInterceptor 的问题:重试函数不起作用。 我的请求拦截器:

class MyRequestInterceptor: RequestInterceptor {
    // MARK: - ADAPT
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        print("-------ADAPT---------")
        var request = urlRequest
        guard let token = TokenService.getAccess() else {
            return
        }
        let bearerToken = "Bearer \(token)"
        request.setValue(bearerToken, forHTTPHeaderField: "Authorization")
        completion(.success(request))
    }
    
    // MARK: - RETRY
    func retry(_ request: Request, for session: Session, dueTo error: ApiError, completion: @escaping (RetryResult) -> Void) {
        print("--------RETRY-------")
        guard let refresh = TokenService.getRefresh() else {
            completion(.doNotRetry)
            return
        }
        let parameter = Refresh(token: refresh)
        AF.request(ApiManager.refresh.path, method: .post, parameters: parameter)
            .responseDecodable(of: TokensPair.self) { response in
                guard let tokens = response.value else {
                    completion(.doNotRetry)
                    return
                }
                TokenService.setAccess(token: tokens.access)
                TokenService.setRefresh(token: tokens.refresh)
                completion(.retry)
            }
    }
}

我的会话管理器:

class SessionManager {
    static let shared = SessionManager()
    
    let sessionManager: Session = {
        let configuration = URLSessionConfiguration.af.default
        configuration.timeoutIntervalForRequest = 30
        configuration.waitsForConnectivity = true
        return Session(
            configuration: configuration,
            interceptor: MyRequestInterceptor()
        )
    }()
}

我的要求:

    func checkUser(complition: @escaping (Result<User, ApiError>) -> Void) {
        SessionManager.shared.sessionManager.request(ApiManager.me.path).validate().responseDecodable(of: User.self) {
            response in
            guard let user = response.value else {
                complition(.failure(.invalidCred))
                return
            }
            complition(.success(user))
        }
    }

Adapt 正常工作。但重试永远行不通。我究竟做错了什么? 我正在使用 validate() 并期望状态代码:401 导致导致重试的错误,但它不起作用。 我认为重试实施中存在问题。因为当我尝试替换

class MyRequestInterceptor: RequestInterceptor

class MyRequestInterceptor: RequestRetrier, RequestAdapter

我收到错误:

Type 'MyRequestInterceptor' does not conform to protocol 'RequestRetrier'

但我不知道为什么。而且我没有找到解决方案。

我使用: Xcode 13.2.1, Swift: 5, 阿拉莫菲尔:5.4.4.

谢谢!

您在 retry 方法签名中使用了 ApiError,这违反了一致性。它与 RequestInterceptor 一起使用,因为该类型提供了默认实现。匹配正确的签名,确保没有本地类型隐藏签名中的类型,它应该可以正常工作。