2013-04-10 42 views
1

在訂閱上,我的ReplaySubject訂閱服務器想知道重播歷史記錄何時完成,並且它變成了「實時」訂閱。此外,所述用戶還希望接收每個項目的通知時間。通知時間戳&從ReplaySubject啓動

我想唯一的方法是複製ReplaySubject源並使其返回一個包含Timestamped的對象和一個指示RemovableDisposable.IsStarted狀態的bool?

除非任何人都可以提出更好的選擇?

+0

你現在有什麼?從你提供的信息中確切的設置很難猜到 - 你已經有了'ReplaySubject'?它如何被「餵食」?它目前是否標記事件?你有能力改變它的聲明/行爲嗎? – JerKimball 2013-04-10 22:18:12

+0

不,這只是一個如何完成的理論問題。我參考的時間戳是ReplaySubjects自己的內部時間戳,它將項​​目添加到主題中時包裝項目。 我想這個問題的一個更好的方法可能是,'我如何將內部時間戳和subscription.isStarted重播對象公開給訂閱者?' 抱歉,感謝您的聆聽。 – stevebull 2013-04-11 08:00:30

回答

0

您的回放主題提供的每個項目都應該是包含TimeStamp(指示其初次創建時的原始時間)的包裝項目。 不要將它與Observable.TimeStamp()運算符混淆,它會給你每個通知的最新(實時)時間戳。相反,您希望在通過主題首次播放項目時錄製TimeStamp,併爲未來的任何訂閱者重播相同的時間戳。 即如果你觀察到的是目前

IObservable<T>, you could change it to be IObservable<TimeStamped<T>>, 

與自己的自定義單子時,Rx「時間戳的」一,(或只是一個簡單的包裝類開始,如果你願意的話)。

一旦你有這個,我會認爲這兩個要求都非常簡單,但你不需要'布爾'。

相反,您的訂戶可以緩存自己的時間戳,代表訂閱時間。然後,您可以定義:

  • IsAReplayedItem = subscriberTimeStamp> = T.TimeStamp

  • IsALiveItem = subscriberTimeStamp < T.TimeStamp

這使得它在我看來簡單。 要讓主題成爲重播/實況(而不是客戶端通過比較TimeStamps)來告訴你的唯一方法是編寫自己的自定義重播主題。 這將'OnSubscribe',提供一個新的觀察者的緩存項目,包裝在'bool = true'的類中,後面是'OnNext'中的任何未來項目,'bool = false'。但是,您需要: a)緩存先前的項目 b)緩存訂戶 c)在處理更新時管理相當複雜的處理過程,同時向訂戶回放初始緩存(有效維護每個訂戶的緩存)。

這讓我感到複雜得多,沒有真正的好處。保持簡單,只需使用時間戳。

Howard Andresier

p.s. 'IsStarted'需求可以通過將ReplaySubject包裝在一個容器類中來解決。這個類可以暴露底層的IObservable,但也可以維護它自己的訂閱,當它觀察它的第一個項目時,它將本地bool'IsStarted'設置爲true。 外部呼叫者隨後可以使用該主題,或隨時評估「IsStarted」布爾值。

+0

感謝霍華德,我沒有想到用這種方式使用時間戳。 – stevebull 2013-04-11 19:14:12

+0

不用擔心。剛做了一個小修改,指出您可以重用Rx中可用的時間戳 Monad,但不能通過.TimeSTamp()擴展方法(僅用於包裝每個值)。從一開始,您的主題將是一個IO > - 無論何時觀察/重播,TimeStamp對於每個項目都是恆定的。即構建您自己的這些流,並通過您的主題播放它們:http://msdn.microsoft.com/en-us/library/hh228977(v=vs.103).aspx – 2013-04-12 08:24:06

+0

謝謝,我已經發現時間戳之前你提到,並且確實已經用它來達到這個效果。然而,我正在努力研究每個訂戶如何知道自己的訂閱是否已經開始,或者是否仍在接收重播項目,因爲這個屬性是每個訂閱者。請問能否詳細說明這一點? – stevebull 2013-04-13 16:08:16