如何获得 IObservable 的最后已知值?
How do I get the last known value of an IObservable?
假设我正在使用 Rx.Net 构建图像编辑器。用户可以使用鼠标操作 canvas。应用的操作取决于当前选择的工具。例如,可能有一个 "draw" 工具和一个 "erase" 工具。一次只能选择一个工具。
我有三个流;一个用于鼠标事件;一个用于通过单击鼠标发出的命令;另一个用于工具选择:
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));
但是,这似乎不像 "reactive" 做事的方式。我可以使用流组合实现同样的逻辑吗?
我查看了 CombineLatest
,但它会导致在用户切换工具时生成不需要的事件。我只希望在用户单击时发出命令。
It sounds like you need .Switch()
.
Try this code:
IObservable<ICommand> commands =
toolSelection
.Select(t => mouse.Select(m => t.CreateCommand(m)))
.Switch();
The extension method .Switch()
takes, in this case, an IObservable<IObservable<ICommand>>
and turns it into an IObservable<ICommand>
by taking the latest observable produced by the outer observable and only producing values from it and disposing of previous ones.
Or, in more English terms, whenever the user clicks on a new tool you get a stream of mouse commands built using only the latest tool in one nice query.
假设我正在使用 Rx.Net 构建图像编辑器。用户可以使用鼠标操作 canvas。应用的操作取决于当前选择的工具。例如,可能有一个 "draw" 工具和一个 "erase" 工具。一次只能选择一个工具。
我有三个流;一个用于鼠标事件;一个用于通过单击鼠标发出的命令;另一个用于工具选择:
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));
但是,这似乎不像 "reactive" 做事的方式。我可以使用流组合实现同样的逻辑吗?
我查看了 CombineLatest
,但它会导致在用户切换工具时生成不需要的事件。我只希望在用户单击时发出命令。
It sounds like you need .Switch()
.
Try this code:
IObservable<ICommand> commands =
toolSelection
.Select(t => mouse.Select(m => t.CreateCommand(m)))
.Switch();
The extension method .Switch()
takes, in this case, an IObservable<IObservable<ICommand>>
and turns it into an IObservable<ICommand>
by taking the latest observable produced by the outer observable and only producing values from it and disposing of previous ones.
Or, in more English terms, whenever the user clicks on a new tool you get a stream of mouse commands built using only the latest tool in one nice query.