2017-03-20 3 views
2

관찰 할 수있는 샘플을 만들고 싶지만 모든 조건을 받아들이고 싶은 특정 조건이있는 상황이 있습니다. 이것은 내 시도이지만 주 시퀀스에 대한 지속적인 재 등록으로 인해 안전하지 않다고 느낍니다. 예를 들어, 샘플링이 계속 켜지고 꺼지는 경우 메인 시퀀스가 ​​항상 가입시 값을 생성하면 항상 중복 이벤트가 발생합니다.Rx.Net을 사용하여 조건부 샘플 결합기를 작성하는 방법

IObservable<T> 
SampleMaybe<T> 
    (this IObservable<T> @this 
    , IObservable<<IObservable<T>>> sample 
    ) 
{ 
    return sample 
     .Select(s => s != null ? @this.Sample(s) : @this) 
     .Switch(); 
} 

답변

0

여기에는 제목을 사용하는 시도가 나와 있습니다. 그것은 원래의 시퀀스를 주제로 등록한 다음 주제를 사용하여 원래의 샘플링 로직을 질문에 제공함으로써 뜨겁게 유지합니다.

public static IObservable<T> Sample<T> 
    (this IObservable<T> @this 
    , IObservable<IObservable<T>> sample 
    ) 
{ 
    return Observable.Create<T>(observer => 
    { 
     var s = new Subject<T>(); 
     var d0 = sample 
      .Select(s1 => s1 != null ? s.Sample(s1) : s) 
      .Switch() 
      .Subscribe(observer.OnNext); 
     var d1 = @this.Subscribe(v => s.OnNext(v)); 
     return new CompositeDisposable(d0,d1); 
    }); 

} 
2

귀하의 .Sample(s) 전화에 대해 확실하지 않습니다. 나는 삼항 연산자의 양면이 결국 같다고 생각합니다.

그렇다고해서 원래의 접근 방식은 단점이 있지만 구독은 부작용이 없다고 생각합니다. 구독을 유지 관리하는 예는 다음과 같습니다.

public static IObservable<T> SampleSometimes<T>(this IObservable<T> source, TimeSpan sampleTime, IObservable<bool> isSamplingOn) 
{ 
    return source.Publish(_source => _source 
     .Sample(sampleTime) 
     .Publish(_sampled => isSamplingOn 
      .Select(b => b? _sampled : _source) 
      .Switch() 
     ) 
    ); 
}