Прослушивание наблюдаемого до или до другого наблюдаемого пожара - PullRequest
2 голосов
/ 10 января 2020

У меня есть горячая наблюдаемая 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 Ответ

1 голос
/ 10 января 2020

Если я понимаю вопрос ...

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.

...