Rx.Net Использование Observable.Create вместо Subject - PullRequest
0 голосов
/ 29 января 2019

У меня есть код, который использует тему для создания наблюдаемой.Я могу передать значение в наблюдаемый поток с использованием 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 Ответ

0 голосов
/ 18 февраля 2019

Предполагая, что вам не нужно вызывать 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

...