如何获取IObservable的最后一个已知值?
问题描述:
假设我正在使用Rx.Net构建图像编辑器。用户可以使用鼠标操作画布。应用的操作取决于当前选择的工具。例如,可能有一个“绘图”工具和一个“擦除”工具。一次只能选择一个工具。如何获取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
,但它会导致用户切换工具时产生不需要的事件。我只想要在用户点击时发出命令。
答
这听起来像你需要.Switch()
。
尝试此代码:
IObservable<ICommand> commands =
toolSelection
.Select(t => mouse.Select(m => t.CreateCommand(m)))
.Switch();
扩展方法.Switch()
需要,在这种情况下,IObservable<IObservable<ICommand>>
并通过取最新观察的通过从它的外观察到的,只有生产值和产生其变为IObservable<ICommand>
处置以前的。
或者用更多的英文术语来说,无论用户何时点击一个新工具,您都会在一个很好的查询中使用最新的工具构建一串鼠标命令。