簡體   English   中英

RxSwift flatMapLatest無需處置以前的可觀察對象

[英]RxSwift flatMapLatest without disposing previous observables

我正在從以下位置使用RxSwift游樂場: https : //github.com/ReactiveX/RxSwift

我實現了以下示例代碼來建模一個簡單的異步任務,將一個Observable of Int轉換為一個Observable of 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)

調試輸出:

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運算符,或者我需要以某種方式拆分序列。

我希望有人對實現該目標有一個想法,可以對我有所幫助,非常感謝。

編輯:對我來說,它看起來更像一個隊列實現,只要新的Int值在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 );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM