Ios RxSwift Flatmap最新版本,无需处理以前的观测值

Ios RxSwift Flatmap最新版本,无需处理以前的观测值,ios,swift,functional-programming,rx-java,rx-swift,Ios,Swift,Functional Programming,Rx Java,Rx Swift,我使用RxSwift游乐场的地点是: 我实现了以下示例代码来模拟一个简单的异步任务,将Int的可观测值转换为String的可观测值: let pubishSubject = PublishSubject<Int>() pubishSubject.asObservable() .debug("before") .flatMap ({ (value) -> Observable<String> in let task: Observab

我使用RxSwift游乐场的地点是:

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

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)
我需要完成所有异步任务才能继续,这是完全正常的,但我只需要订阅最新的结果(异步3)

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

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

我希望有人有一个想法如何实现这一点,可以帮助我,非常感谢


编辑:对我来说,它更像是一个队列实现,只要在PublishSubject上发布了新的Int值,并且仍然有异步任务在运行,它就应该跳过所有中间结果,并根据最后发出的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 );
}
@测试
public void testSwitchMap()引发异常{
PublishSubject源=PublishSubject.create();
来源
.doOnNext(v->logger.debug(“排放:{}”,v))
.switchMap(v->可观察的.just(v)
.延迟(100,TimeUnit.ms)
.发布(s->{
s、 订阅();
返回s;
} ) )
.subscribe(v->logger.debug(“最终结果{}”,v));
source.onNext(Integer.valueOf(1));
source.onNext(Integer.valueOf(2));
source.onNext(Integer.valueOf(3));
睡眠(1_000);
}

您是否签出了
takeLast
运算符?是的,我尝试过,在上面的示例中,takeLast不起作用,因为它在序列完成时只发出最后的n个值,但序列(PublishSubject)永远不会完成,我正在考虑将PublishSubject更改为其他内容,但是没有找到正确的解决方案YetQuit有趣的问题,我试着玩你的例子,我不知道在RxSwift上实现会有多复杂,但可能你会发现对你的案例有帮助?当你不需要之前的异步调用的输出时,取消它们有什么问题?
@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 );
}