Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试
Posted
技术标签:
【中文标题】Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试【英文标题】:Alamofire 5.0.0-rc.3 RequestInterceptor Adapt method not being called of Alamofire although retry gets called when there is any error in response 【发布时间】:2019-11-14 08:59:41 【问题描述】:。
方法:
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (AFResult<URLRequest>) -> Void)
class Interceptor: RequestInterceptor
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (AFResult<URLRequest>) -> Void)
print("ADAPT :=")
completion(.success(urlRequest))
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)
print("RETRY :=")
completion(.doNotRetry)
不同类的网络请求方法:
public func request<T: Codable> (_ urlConvertible: URLRequestConvertible) -> Observable<T>
return Observable<T>.create observer in
// 1
print("Url := \(urlConvertible.urlRequest!.url!)")
// 2
let request = AF.request(urlConvertible, interceptor: Interceptor()).responseDecodable (response: AFDataResponse<T>) in
if let data = response.data
print("Response := \(String(decoding: data, as: UTF8.self))")
else
print("data is nil")
switch response.result
case .success(let value):
print("value :-> \(value)")
observer.onNext(value)
observer.onCompleted()
case .failure(let error):
observer.onError(error)
//Finally, we return a disposable to stop the request
return Disposables.create
request.cancel()
【问题讨论】:
【参考方案1】:看这里:
https://github.com/Alamofire/Alamofire/issues/2998
函数没有被调用,因为存在歧义...
在拦截器中:
添加这个:
typealias AdapterResult = Swift.Result<URLRequest, Error>
并在“adapt”方法中将@escaping 参数替换为:
@escaping (RetryResult)
它应该可以工作。
【讨论】:
以上是关于Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试的主要内容,如果未能解决你的问题,请参考以下文章
将 json 数据转换为 [[String: AnyObject]] 后,它似乎是空的 - 为啥?
Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本