【问题标题】:Alamofire 5.0.0-rc.3 RequestInterceptor Adapt method not being called of Alamofire although retry gets called when there is any error in responseAlamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试
【发布时间】:2019-11-14 08:59:41
【问题描述】:

Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试。

方法:

    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()
            }
        }

    }

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    看这里:

    https://github.com/Alamofire/Alamofire/issues/2998

    函数没有被调用,因为存在歧义...

    在拦截器中:

    添加这个:

    typealias AdapterResult = Swift.Result<URLRequest, Error>
    

    并在“adapt”方法中将@escaping 参数替换为:

    @escaping (RetryResult)
    

    它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2019-10-29
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多