¿Cómo puedo controlar qué elementos se empujan a través de un observable dependiendo de los valores (booleanos) de otro observable b ?
Quiero decir, los elementos que están en a se envían solo si el último elemento emitido por b es verdadero.
La secuencia observable b debería actuar como un filtro de paso.
OK, creo que tengo al menos una solución. Se puede hacer con una combinación de WithLatestFrom y Where .
En mi código real, tengo esto:
positionObs .WithLatestFrom(isSeekingObs, (pos, isSeeking) => new { pos, isSeeking }) .Where(x => !x.isSeeking) .Select(x => x.pos);Es esencial combinar los dos valores más recientes y aplica un filtro en el "señalizador".
De todos modos, me gustaría saber si hay una solución más limpia.
Mi forma preferida de hacer este tipo de cosas es con una combinación de Publish y Switch .
Así es cómo:
Subject<bool> subject_b = new(); IObservable<bool> observable_b = subject_b.AsObservable(); IObservable<long> observable_a = Observable.Interval(TimeSpan.FromSeconds(1.0)); IObservable<long> observable_c = observable_a .Publish(published_a => observable_b .Select(value_b => value_b ? published_a : Observable.Never<long>())) .Switch(); IDisposable subscription = observable_c.Subscribe(Console.WriteLine); Thread.Sleep(TimeSpan.FromSeconds(2.5)); subject_b.OnNext(true); Thread.Sleep(TimeSpan.FromSeconds(3)); subject_b.OnNext(false); Thread.Sleep(TimeSpan.FromSeconds(4)); subject_b.OnNext(true);Eso da:
2 3 4 9 10 11 12 13 14 ... Prefiero Publish / Switch over WithLatestFrom ya que hay más variedad de consultas que el primero maneja que el segundo no.