2017-01-22 67 views
1

我想实现自动保存功能。我有两个观测量:使用C中的RX自动保存#

  • IObservable<Unit> changes:发出一个项目的每个用户编辑文本
  • IObservable<Unit> saves时间:发出的每一个保存按钮被按下

现在时间我想结合保存事件那些成第三流writeBack。这个流有一个用户,它将当前文本写入数据库。

如何创建writeBack流,以便它满足以下属性?

  • 一个未保存的变化被写回,如果还没有发生任何改变3秒(如油门
  • 保存事件写回的最后一个未保存的更改将立即

我要确保只有只有回写未保存的更改。我不希望保存的文本,如果:

  • 存在保存的事件,但没有改变
  • 2保存在连续的事件,但在
  • 之间
  • 有变化之间的保存事件没有变化和它的自动保存

回答

0

这应该做到这一点。首先,我们找出时候,我们可能希望保存:

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 
} 
+0

谢谢,这也正是它应该。我找到了自己的解决方案,但是它使用了带有延迟流的Windows,并且很复杂。这一个更容易。好主意使用扫描。 – Streamfighter

+0

谢谢。无论何时,如果您从历史的角度来看待逻辑,“扫描”应该是您期待的第一件事。 – Shlomo