2017-01-16 3 views
2

Во многих случаях мне нужно получить доступ к последнему испускаемому значению из наблюдаемого. То, как я это сделал, - это подписка на наблюдаемые и кеширующие значения по мере их появления. См. Ниже, например. Однако я вижу, что существует множество методов, таких как Observable.MostRecent, Observable.Latest, Replay (1) и т. Д., Которые, похоже, могут выполнить то, что я ищу, но я не могу понять, как их использовать. Есть ли лучший подход, чем метод, который я использую ниже?Кэширование последнего испускаемого значения из наблюдаемого

public class WordPrinterWithCache 
{ 
    string _lastWord = string.Empty; 

    public WordPrinterWithCache(IObservable<string> words) 
    { 
     words.Subscribe(w => _lastWord = w); 
    } 

    public void PrintMostRecent() => Console.WriteLine(_lastWord); 
} 
+0

Вы в конечном итоге использовали некоторые из моих предложений или внедрили свой собственный метод? – supertopi

+1

Я пытаюсь избежать необходимости делать это вообще, и большинство из них я строю свой код вокруг наблюдаемых и меньше вокруг изменяемых переменных, тем легче это сделать. Если я хочу самое последнее, я использую CombineLatest или WithLatestFrom. – JustinM

ответ

1

Вот два метода, которые я бы рассмотрел при реализации этого поведения.

var bs = new BehaviorSubject<long>(0); //initial value 
source.Subscribe(bs.OnNext); 
Console.WriteLine(bs.Value); 

С BehaviorSubject вы можете получить доступ к последнему значению через свойство.

var ls = source.TakeLast(1); 
bs.Subscribe(Console.WriteLine); 

С TakeLast вы должны подписаться на доступ последнее значение (хотя только одно значение испускается перед утилизацией).

+0

BehaviorSubject не решает проблему наличия IObservable и хочет получить последнее значение. Если бы у меня был BehaviorSubject, я бы просто вызвал метод .Value. Полезно помнить, что TakeLast - и, возможно, другие подобные методы звучания - только действительно что-то при подписке. – JustinM

Смежные вопросы