티스토리 뷰
문제를 더 깊이 파고 드는 동안 가능한 3 가지 해결책을 찾았습니다.
특정 경우에
Disposed
대해 다음과 같이 컨트롤의 이벤트를 사용할 수 있습니다 .var incsFromWidgets = addCounterStream .SelectMany(x => Observable.FromEventPattern(x, "Increment") .Select(_ => 1) .TakeUntil(Observable.FromEventPattern(x, "Disposed").Take(1))) .Publish();
실제로는 첫 번째 방법의 일반화입니다. 다음과 같이 릴리스 의미 체계를 사용하여 일반 래퍼 클래스를 만들 수 있습니다.
class Wrapper<T> : IDisposable { public T Value { get; set; } public event EventHandler Disposed; }
스트림의 수동 "게양":
// declare all streams IObservable<int> aStream = null; IObservable<bool> bStream = null; IObservable<MyWidget> cStream = null; // then compose it aStream = Observable.From(...).TakeUntil(bStream.Where(...)); bStream = Observable.From(...).CombineLatest(aStream, ...); // cyclic dependency
세 번째 방법은 끔찍해 보일 수 있지만 다양한 방식으로 스트림을 결합 할 수있는 큰 가능성을 제공합니다.주의해야하며 무한 재귀를 생성하지 마십시오.
편집 : 글쎄, 실제로 세 번째 방법은 그렇게 간단하지 않으며 스트림이 아래에 정의되어 있더라도 NullReferenceException을 throw합니다. 적절한 구현은 다음과 같습니다.
IConnectableObservable<int> a = null;
IConnectableObservable<char> b = null;
IConnectableObservable<bool> c = null;
a = Observable.Defer(() => b.Select(x => (int)x)).Publish();
b = Observable.Defer(() => Observable.Generate('A', x => x < 255, x => (char)(x + 1), x => x).TakeUntil(c)).Publish();
c = Observable.Defer(() => a.SkipWhile(x => x < 70).Select(_ => true)).Publish();
a.Subscribe(x => Console.WriteLine($"from a: {x}"));
b.Subscribe(x => Console.WriteLine($"from b: {x}"));
c.Connect();
a.Connect();
b.Connect();
Console.ReadKey(true);
출처
https://stackoverflow.com/questions/39929998