我開始學習 Swift 和 Alamofire。但是我遇到了 RequestInterceptor 的問題:retry func 不起作用。我的請求攔截器:
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))
}
}
適應作業正常。但重試永遠不起作用。我究竟做錯了什么?我正在使用validate()并期望狀態代碼:401 會導致導致重試的錯誤,但它不起作用。我認為重試實施存在問題。因為當我嘗試更換時
class MyRequestInterceptor: RequestInterceptor
到
class MyRequestInterceptor: RequestRetrier, RequestAdapter
我得到錯誤:
Type 'MyRequestInterceptor' does not conform to protocol 'RequestRetrier'
但我不知道為什么。我沒有找到解決方案。
我使用:Xcode 13.2.1,Swift:5,Alamofire:5.4.4。
謝謝!
uj5u.com熱心網友回復:
您ApiError在retry方法簽名中使用了,這破壞了一致性。它可以使用,RequestInterceptor因為該型別提供了默認實作。匹配正確的簽名,確保沒有本地型別覆寫簽名中的型別,并且它應該可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403688.html
標籤:
