Хочу поделиться с вами тем, как я это сделал. Возможно, это не ответ на ваш вопрос, но он показывает способ достижения желаемого поведения с помощью операторов RxSwift.
У меня есть функция, которая принимает параметр тайм-аута и делает запрос:
func request(timeout: TimeInterval, ...other params) -> Observable<...>
Внутри этой функции я преобразовываю timeout в 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)
}
person
iWheelBuy
schedule
11.01.2018