2013-08-16 34 views
4

我有下面的頭一個數據源:如何判斷Switch是否改變了輸出?

IObservable<IObservable<object>> MagicSource(IObservable<string> strings) 

我把那裏的字符串,它給我的結果,但考慮到戶頭,那我需要答案只爲最後一個字符串,我用switch語句爲了取消以前的:

MagicSource(StringsProvider).Switch().Subscribe(r => {/*...*/}); 

行之有效,但我也需要得到通知,目前正在處理字符串已更改準備我的結果視圖的目的。如何獲得此類通知?

+0

哪件事上市還有就是你觀察到的是訂閱的枚舉? –

+0

MagicSource是字符串查詢的外部部分,它根據給定的字符串選擇其對象,並將這些對象返回爲可觀察的。 –

+0

如果這是一個新的可觀察對象,你可以調用它來獲取最近的?或者將它最新的一切都包含在內? –

回答

1

我個人會避免Do語句。

您可以創建投影。

在這種投射我假設你想要做的處置目前內部序列的作用(也許從表中清理出當前記錄?)

MagicSource(StringsProvider) 
    .Select(inner=>inner.Finally(CleanUp)) 
    .Switch() 
    .Subscribe(r => {/*...*/}); 

如果你想要做相同的,但針對內部序列的訂閱(而非處置),那麼你有更多的工作要做。我會創造對稱的運營商最後,Initially(Action)

public static class ObservableEx 
{ 
    public static IObservable<T> Initially<T>(this IObservable<T> source, Action onSubscribe) 
    { 
     return Observable.Create<T>(o=>{ 
      try 
      {   
       onSubscribe(); 
       return source.Subscribe(o); 
      } 
      catch (Exception ex) 
      { 
       o.OnError(ex); 
       return Disposable.Empty; 
      } 
     }); 
    } 
} 

然後你可以使用它像這樣

MagicSource(StringsProvider) 
    .Select(inner=>inner.Initially(Prepare)) 
    .Switch() 
    .Subscribe(r => {/*...*/}); 
+0

我剛剛讀過你的書_Rex_介紹,你的回答也很好,謝謝。 –

1

最簡單的方法是隻使用一個Do聲明:

這裏有一些品種。

如果你什麼都不知道如何MagicSource,並且不能準確地涉及新傳入的字符串以新的內流:

Action NewStreamProduced = ...; 
MagicSource(StringsProvider).Do(_ => NewStreamProduced).Switch().... 

如果你知道MagicSource將同步產生新的內流,每次一個新字符串到達​​,然後你可以把你Do調用MagicSource前:

Action<string> NewStringArrivedWhichMeansWeAreSwitching = ...; 
MagicSource(StringsProvider.Do(NewStringArrivedWhichMeansWeAreSwitching)).Switch()... 
+0

''Do''有問題。最好使用多播爲通知部分生成另一個可觀察對象。請參閱http://stackoverflow.com/ a/18310461/158285 – bradgonesurfing

1

你應該添加索引到每個元素指示它來自子源。很簡單。

IObservable<Tuple<string, int>> results = 
MagicSource(StringsProvider) 
.Select((v,i)=>v.Select(y=>Tuple.Create(y,i)) 
.Switch() 
1

其實最好的辦法是以下幾點。你需要使用多播。

// Ensure that you are using multicast 
var source = MagicSource(strings).Publish().RefCount(); 

// Subscribe to this for notification and count 
var notifications = source.Select((v,i)=>i); 

// Subscribe to this to get flattened data 
var flattened = source.Switch() 

Publish().RefCount()創建時,當最後一個認購除去第一訂閱進行,然後取消訂閱,訂閱一旦組播源。要記住的重要一點是,只有一次訂閱源代碼的過程可能會或可能不重要。

相關問題