【问题标题】:How do I get the last known value of an IObservable?如何获得 IObservable 的最后一个已知值?
【发布时间】:2016-07-07 08:00:00
【问题描述】:

假设我正在使用 Rx.Net 构建一个图像编辑器。用户可以使用鼠标操作画布。应用的操作取决于当前选择的工具。例如,可能有一个“绘制”工具和一个“擦除”工具。一次只能选择一种工具。

我有三个流;一个用于鼠标事件;一种用于通过单击鼠标发出的命令;另一个用于工具选择:

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,但它会导致在用户切换工具时生成不需要的事件。我只希望在用户单击时发出命令。

【问题讨论】:

    标签: c# system.reactive rx.net


    【解决方案1】:

    听起来你需要.Switch()

    试试这个代码:

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

    在这种情况下,扩展方法.Switch() 采用IObservable&lt;IObservable&lt;ICommand&gt;&gt; 并将其转换为IObservable&lt;ICommand&gt;,方法是采用外部可观察对象产生的最新可观察对象,仅从中产生值并处理以前的值。

    或者,用更英语的术语来说,每当用户点击一个新工具时,您都会在一个不错的查询中获得仅使用最新工具构建的鼠标命令流。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2013-12-13
      相关资源
      最近更新 更多