gpt4 book ai didi

ios - RxSwift flatMapLatest 无需处理以前的可观察值

转载 作者:行者123 更新时间:2023-11-30 11:26:56 25 4
gpt4 key购买 nike

我正在使用 RxSwift Playground: https://github.com/ReactiveX/RxSwift

我实现了以下示例代码来建模一个简单的异步任务,将 Int 的 Observable 转换为 String 的 Observable :

let pubishSubject = PublishSubject<Int>()
pubishSubject.asObservable()
.debug("before")
.flatMap ({ (value) -> Observable<String> in
let task: Observable<String> = Observable.create { observer in
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
print("Executed \(value)")
observer.on(.next("Async \(value)"))
observer.on(.completed)
})
return Disposables.create(with: {
print("Disposed \(value)")
})
}
return task
})
.debug("after")
.subscribe()

pubishSubject.onNext(1)
pubishSubject.onNext(2)
pubishSubject.onNext(3)

调试输出:

2018-06-01 14:08:35.748: after -> subscribed
2018-06-01 14:08:35.749: before -> subscribed
2018-06-01 14:08:35.751: before -> Event next(1)
2018-06-01 14:08:35.753: before -> Event next(2)
2018-06-01 14:08:35.753: before -> Event next(3)
Executed 1
2018-06-01 14:08:36.785: after -> Event next(Async 1)
Disposed 1
Executed 2
2018-06-01 14:08:36.786: after -> Event next(Async 2)
Disposed 2
Executed 3
2018-06-01 14:08:36.787: after -> Event next(Async 3)
Disposed 3

我需要完成所有异步任务才能继续,这工作得很好,但我只需要订阅最新结果(异步 3)。

我无法使用 flatMapLastest 运算符,因为它会取消/处置以前的异步调用。

我不知道如何实现这一点,我感觉自己被完全阻止了,也许我可以使用一个简单的 RxSwift 运算符来实现这一点,或者我需要以某种方式分割序列。

我希望有人知道如何实现这一目标并可以帮助我,非常感谢。

编辑:对我来说,它看起来更像是一个队列实现,只要在 PublishSubject 上发布新的 Int 值并且仍然有异步任务在运行,它就应该跳过所有中间结果并根据上次发出的返回最后结果整数

最佳答案

我在 RxJava 中有一个解决方案。转换为 RxSwift 应该很简单。

使用switchMap()运算符不断切换到最新的发射。为了完成之前的排放,您需要订阅它们并发出值。为此,请使用 publish() 运算符:

@Test
public void testSwitchMap() throws Exception {
PublishSubject<Integer> source = PublishSubject.create();

source
.doOnNext( v -> logger.debug( "emission: {}", v ) )
.switchMap( v -> Observable.just( v )
.delay( 100, TimeUnit.MILLISECONDS )
.publish( s -> {
s.subscribe();
return s;
} ) )
.subscribe( v -> logger.debug( "end result {}", v ) );

source.onNext( Integer.valueOf( 1 ) );
source.onNext( Integer.valueOf( 2 ) );
source.onNext( Integer.valueOf( 3 ) );
Thread.sleep( 1_000 );
}

关于ios - RxSwift flatMapLatest 无需处理以前的可观察值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com