在 RXMoyaProvider 上设置请求超时
Set request timeout on RXMoyaProvider
我正在将 Moya 与 RxSwift 一起使用,我正在尝试按照建议使用以下代码设置网络调用(API 调用)的请求超时:
声明您的供应商时包含自定义 Alamofire 管理器
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([=12=]) })
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)
}
我正在将 Moya 与 RxSwift 一起使用,我正在尝试按照建议使用以下代码设置网络调用(API 调用)的请求超时:
声明您的供应商时包含自定义 Alamofire 管理器
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([=12=]) })
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)
}