Rx.Net Использование Observable.Create вместо Subject
У меня есть код, который использует тему для создания наблюдаемой. Я могу передать значение в наблюдаемый поток с использованием subject.onNext (значение). Проблема в том, что если я подпишусь на это наблюдаемое после того, как значение будет передано, я бы хотел получить это значение. Из того, что я могу сказать, предметы не держат ценность, они просто передают их как событие. Итак, как мне изменить этот код с использования субъекта на использование Observable.
private readonly Subject<int> _valueSubject = new Subject<int>();
public IObservable<int> ValueObservable => _valueSubject ;
public void SetValue(int valuePassedIn)
{
_valueSubject.OnNext(valuePassedIn);
}
Изменить: Обнаружил, что вы можете получить последние значения с помощью BehaviorSubject, но все равно хотел бы знать, как использовать Observable.Create вместо Subject в сценарии, подобном этому.
1 ответ
Предполагая, что вам не нужно вызывать OnNext напрямую, холодная наблюдаемая может быть тем, что вы хотите:
IObservable<int> coldObservable = Observable.Create<int>(obs =>
{
obs.OnNext(1);
obs.OnNext(2);
obs.OnNext(3);
obs.OnCompleted();
return () => { };
});
В противном случае ReplaySubject позволит вам сохранить размерный буфер значений, которые будут отправляться при подписке каждого наблюдателя. Не совсем то же самое, что вспоминать все значения, которые я понимаю, но в любом случае это не будет хорошей идеей из-за использования памяти. Может быть ближе, чем единственное значение, которое обеспечивает BehaviourSubject.
Следующее позволит 2 значениям быть доступными для новых подписчиков:
ISubject<int> replaySubject = new ReplaySubject<int>(2);
IObservable<int> observable;
[TestMethod]
public void TestMethod()
{
observable = replaySubject;
replaySubject.OnNext(1);
replaySubject.OnNext(2);
replaySubject.OnNext(3);
replaySubject.OnNext(4);
replaySubject.OnNext(5);
observable.Subscribe(OnValue);
}
Выход:
Наблюдаемое значение:4 Наблюдаемое значение:5