У меня есть горячая наблюдаемая 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
Как мне управлять этими тремя наблюдаемыми для достижения желаемого поведения?