在訂閱上,我的ReplaySubject訂閱服務器想知道重播歷史記錄何時完成,並且它變成了「實時」訂閱。此外,所述用戶還希望接收每個項目的通知時間。通知時間戳&從ReplaySubject啓動
我想唯一的方法是複製ReplaySubject源並使其返回一個包含Timestamped的對象和一個指示RemovableDisposable.IsStarted狀態的bool?
除非任何人都可以提出更好的選擇?
在訂閱上,我的ReplaySubject訂閱服務器想知道重播歷史記錄何時完成,並且它變成了「實時」訂閱。此外,所述用戶還希望接收每個項目的通知時間。通知時間戳&從ReplaySubject啓動
我想唯一的方法是複製ReplaySubject源並使其返回一個包含Timestamped的對象和一個指示RemovableDisposable.IsStarted狀態的bool?
除非任何人都可以提出更好的選擇?
您的回放主題提供的每個項目都應該是包含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」布爾值。
感謝霍華德,我沒有想到用這種方式使用時間戳。 – stevebull 2013-04-11 19:14:12
不用擔心。剛做了一個小修改,指出您可以重用Rx中可用的時間戳
謝謝,我已經發現時間戳
你現在有什麼?從你提供的信息中確切的設置很難猜到 - 你已經有了'ReplaySubject'?它如何被「餵食」?它目前是否標記事件?你有能力改變它的聲明/行爲嗎? – JerKimball 2013-04-10 22:18:12
不,這只是一個如何完成的理論問題。我參考的時間戳是ReplaySubjects自己的內部時間戳,它將項目添加到主題中時包裝項目。 我想這個問題的一個更好的方法可能是,'我如何將內部時間戳和subscription.isStarted重播對象公開給訂閱者?' 抱歉,感謝您的聆聽。 – stevebull 2013-04-11 08:00:30