【问题标题】:Autosave with RX in C#在 C# 中使用 RX 自动保存
【发布时间】:2017-01-23 23:19:24
【问题描述】:

我想实现一个自动保存功能。我有两个 Observable:

  • IObservable<Unit> changes:每次用户编辑文本时发出一个项目
  • IObservable<Unit> saves:每次按下保存按钮时都会发出一个保存事件

现在我想将它们组合成第三个流writeBack。该流有一个订阅者,它将当前文本写入数据库。

如何创建 writeBack 流,以使其满足以下属性?

  • 如果 3 秒内没有发生任何更改(如 throttle),则将写回未保存的更改
  • 保存事件立即写回最后未保存的更改

我想确保仅写回未保存的更改。如果出现以下情况,我不想保存文本:

  • 有一个保存事件,但没有变化
  • 连续两次保存事件,但中间没有变化
  • 在更改与其自动保存之间有一个保存事件

【问题讨论】:

    标签: c# system.reactive autosave rx.net


    【解决方案1】:

    应该这样做。首先,我们确定我们可能想要节省的时间:

    var saveTriggers = changes.Throttle(TimeSpan.FromSeconds(3))
        .Merge(saves);
    

    接下来我们将它们过滤掉以确保它们符合您的逻辑:每次保存之间至少进行一次编辑,并且不能先保存。 SkipWhile 只是为了确保忽略更改之前的保存。 Scan 计算每次保存之间的更改次数。我们只关心该数字何时变为 0(表示触发了保存)。并且DistinctUntilChanged 过滤掉连续保存。

    var actualSaves = saveTriggers.Select(_ => EventType.SaveTrigger)
        .Merge(changes.Select(_ => EventType.Edit))
        .SkipWhile(et => et == EventType.SaveTrigger)
        .Scan(0, (editCount, eventType) => eventType == EventType.SaveTrigger ? 0 : editCount + 1)
        .DistinctUntilChanged()
        .Where(count => count == 0)
        .Select(_ => Unit.Default);
    

    并使用枚举类

    enum EventType
    {
        SaveTrigger,
        Edit
    }
    

    【讨论】:

    • 谢谢,这正是它应该做的。我找到了自己的解决方案,但它使用带有延迟流的 Windows 并且很复杂。这个容易多了。使用 Scan 的好主意。
    • 谢谢。每当您从历史的角度来看逻辑时,Scan 应该是您首先要看的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多