2016-07-06 5 views
4

Предположим, что я создаю редактор изображений, используя Rx.Net. Пользователь может манипулировать холстом с помощью мыши. Применяемая манипуляция зависит от выбранного в данный момент инструмента. Например, может быть инструмент «draw» и инструмент «erase». За один раз можно выбрать только один инструмент.Как получить последнее известное значение IObservable?

У меня есть три потока; один для событий мыши; один для команд, выпущенных щелчком мыши; а другой для выбора инструмента:

IObservable<ITool> toolSelection; 
IObservalbe<MouseState> mouse; 
IObservable<ICommand> commands; 

commands поток зависит от двух других: команды выдается, когда пользователь нажимает кнопку мыши, и команда сгенерирована зависит от последнего выбранного инструмента. Обратите внимание, что команда должна указывать не, когда пользователь меняет инструмент, только когда они нажимают на мышь.

Теперь, я мог бы хранить последний выбранный инструмент в переменной, как это:

var selectedTool = defaultTool; 
toolSelection.Subscribe(x => selectedTool = x); 

я могу использовать selectedTool построить commands поток:

var commands = mouse.Select(x => selectedTool.CreateCommand(x)); 

Однако, это не кажется как «реактивный» способ делать что-то. Могу ли я достичь той же логики, используя потоковые композиции?

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

ответ

4

Похоже, что вам нужно .Switch().

Попробуйте этот код:

IObservable<ICommand> commands = 
    toolSelection 
     .Select(t => mouse.Select(m => t.CreateCommand(m))) 
     .Switch(); 

Метод расширения .Switch() принимает, в этом случае, в IObservable<IObservable<ICommand>> и превращает его в IObservable<ICommand>, взяв последнюю наблюдаемым производство внешнего наблюдаемым и только продуцирующего значение от нее и распоряжение предыдущими.

Или, в более английских терминах, когда пользователь нажимает на новый инструмент, вы получаете поток команд мыши, построенных с использованием только самого последнего инструмента в одном приятном запросе.

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