2017-01-22 61 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