我想和你分享我的做法。它可能无法回答您的问题,但它展示了使用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)
}