여러 가지 방법으로 해결할 수 있습니다. 간단한 것을 살펴 보겠습니다. 이 예제에서는 이벤트가 A
과 B
이 같은 유형이라고 가정합니다. 나는 또한 C
(A
에 묶인) 및 D
(D
에 묶인) 이벤트는 중요한 정보 없이도 관찰 할 수 있다고 가정합니다.
var streamA = new Subject<string>();
var streamB = new Subject<string>();
var switchToA = new Subject<Unit>();
var switchToB = new Subject<Unit>();
지금 여기 우리가 streamA
창을 열 때마다 switchToA
화재 때 switchToB
화재를 닫고, streamB
에 대한 반대를 수행 한 후 병합 :
public IObservable<string> SwitchingWindows(IObservable<string> streamA, IObservable<string> streamB, IObservable<Unit> switchToA, IObservable<Unit> switchToB)
{
var switchedA = streamA.Window(switchToA, _ => switchToB).Concat();
var switchedB = streamB.Window(switchToB, _ => switchToA).Concat();
return switchedA.Merge(switchedB);
}
구독 :
var all = SwitchingWindows(streamA, streamB, switchToA, switchToB);
all.Subscribe(x => Console.WriteLine(x));
테스트 :
streamA.OnNext("a1"); // skip
switchToA.OnNext(Unit.Default); // switch A
streamA.OnNext("a2"); // shown
streamB.OnNext("b1"); // skip
streamA.OnNext("a3"); // shown
switchToB.OnNext(Unit.Default); // switch B
streamB.OnNext("b2"); // shown
streamB.OnNext("b3"); // shown
streamA.OnNext("a4"); // skip
switchToA.OnNext(Unit.Default); // switch A
streamA.OnNext("a5"); // shown
streamB.OnNext("b4"); // skip
streamB.OnNext("b5"); // skip
switchToB.OnNext(Unit.Default); // switch B
streamB.OnNext("b6"); // shown
streamA.OnNext("a6"); // skip
출력은 예상대로입니다 :
는
a2
a3
b2
b3
a5
b6
마지막 스트림 all
100 % 깨끗합니다.
이벤트'C'와'D'는'A'와'B' 스트림에서 유추되었거나 외부 이벤트입니까? 그리고'A'와'B'는 같은 타입입니까? – yamen
@yamen 외부 이벤트입니다. – Alwyn