聆听可观察的声音,直到或直到另一场可观察的声音

时间:2020-01-10 16:34:07

标签: observable rx-swift

我有一个热的可观察的C,我想听直到另一个可观察的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

我该如何管理这三个可观察对象以实现所需的行为?

1 个答案:

答案 0 :(得分: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发出。