听 observable 直到或直到另一个 observable 触发

Posted

技术标签:

【中文标题】听 observable 直到或直到另一个 observable 触发【英文标题】:Listening to observable until or till another observable fires 【发布时间】:2020-01-10 16:34:07 【问题描述】:

我有一个热门的 observable C 我想听它直到另一个 observable B 触发(即生成 onNext 事件)。 B 是一个冷的可观察对象,我不想在另一个可观察对象 A 触发之前“唤醒”它。

换句话说:

我在听C。 我正在听A,一旦它启动,我就开始听(因此醒来)B 一旦B 触发,我就会停止收听C

这是我的代码:

    let b = Observable<Int>.create  s in
        print("b got awoken") // I want to see this line only after A fires
        s.onNext(666)
        s.onCompleted()
        return Disposables.create()
    

    let c = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    c
        .takeUntil(b) // I do not want to listen to C after B has fired
        .subscribe(onNext:  print("C: \($0)") )
        .disposed(by: _bag)

    let a = PublishSubject<Int>()
    a
        .do(onNext: print("A: \($0)") )
        .flatMap _ in return b  // After A fires, I "wake up" (or subsribe to) B
        .subscribe(onNext: print("B: \($0)") )
        .disposed(by: _bag)

    // Some delay to let C generate some events and listen to them
    DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) 
        print("anext 1")
        a.onNext(1)
    

这是输出:

b got awoken
anext 1
A: 1
b got awoken
B: 666

这是所需的输出:

C: 0
C: 1
C: 2
C: 3
anext 1
A: 1
b got awoken
B: 666

我应该如何管理这三个 observable 以实现所需的行为?

【问题讨论】:

你能贴一张你想要的大理石图吗?我不太了解它。 【参考方案1】:

如果我理解了这个问题...

func example(a: Observable<Int>, b: @escaping () -> Observable<Int>, c: Observable<Int>) -> Observable<Int> 
    return c.takeUntil(a.flatMap  _ in b() )

上面将订阅 a 和 c,然后发出 c 的值,直到 a,然后 b 发出。

【讨论】:

以上是关于听 observable 直到或直到另一个 observable 触发的主要内容,如果未能解决你的问题,请参考以下文章

如何限制 observable 直到条件变为真

Android ViewModel Observers 直到方向改变才工作(ViewModel 工作,但更改为 LiveData 会导致问题)

在 Redux Observable 中保持史诗直到收到操作

RxSwift 跳过事件直到自己的序列完成

Rx 操作符三

如何从我的数组列表中删除 __ob__: Observer?