我正在使用带有RxSwift的Moya,我正在尝试使用以下代码设置网络调用(API调用)的请求超时:
在声明您的提供商时包括自定义Alamofire Manager
lazy var provider: RxMoyaProvider<CAPProviderAPI> = {
return RxMoyaProvider<CAPProviderAPI>(endpointClosure: Utility.getEndPointClosure(forProviderType: .authorized), manager: DefaultAlamofireManager.sharedManager, plugins: [NetworkActivityPlugin(networkActivityClosure: networkActivityClosure)])
}()
但我收到一个错误说:使用未解析的标识符'networkActivityClosure'
我想和你分享我做的方式。它可能无法解答您的问题,但它显示了使用RxSwift运算符实现所需行为的方法。
我有一些函数接受超时参数并发出请求:
func request(timeout: TimeInterval, ...other params) -> Observable<...>
在这个函数里面我用这种方式将超时转换为Observable
:
func observableTimeout(timeout: TimeInterval, ...other params) -> Observable<...> {
return Observable<Int>
.timer(timeout, period: ..., scheduler: ...)
.take(1)
.map(to: ...) // map to timeout error
}
如果超时发生 - 我需要取消请求。我做了一些flatMapLatest
模拟,也接受取消信号:
public extension Observable {
public func flatMapLatest<T>(cancel: Observable<T>, factory: @escaping (E) throws -> Observable<T>) -> Observable<T> {
let observableNormal = self
.flatMap({ try factory($0) })
return Observable<Observable<T>>
.of(cancel, observableNormal)
.merge()
.take(1)
}
}
因此,请求函数将以这种方式工作:
func request(timeout: TimeInterval, ...other params) -> Observable<...> {
let cancel = observableTimeout(timeout: timeout, ...)
let factory = ...// your observable factory which makes a request using Moya
return Observable
.just((), scheduler: ...)
.flatMapLatest(cancel: cancel, factory: factory)
}