通知时间戳& IsStarted来自ReplaySubject

时间:2013-04-10 21:26:54

标签: .net system.reactive

在订阅时,我的ReplaySubject订阅者想知道重播历史记录何时结束并成为“实时”订阅。此外,所述订户还希望接收每个项目的通知时间。

我认为唯一的方法是复制ReplaySubject源并使其返回一个包含Timestamped的对象和一个指示RemovableDisposable.IsStarted状态的bool?

除非有人能提出更好的选择吗?

1 个答案:

答案 0 :(得分:0)

您的重播主题提供的每个项目应该是一个包装项目,其中包括TimeStamp(表示其首次创建时的原始时间)。 不要将此与Observable.TimeStamp()运算符混淆,后者将为您提供每个通知的最新(实时)时间戳。相反,您希望在首次播放主题时记录TimeStamp,并为任何将来的订阅者重播相同的时间戳。 即如果您的观察结果目前是

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

使用您自己的自定义Monad,Rx'Timestamped',或者只是一个简单的包装类,如果您愿意,可以开始使用。

一旦你有了这个,我会认为这两个要求都非常简单,但你不需要'布尔'。

相反,您的订阅者可以缓存他们自己的TimeStamp,表示订阅的时间。然后,您可以定义:

  • IsAReplayedItem = subscriberTimeStamp&gt; = T.TimeStamp

  • IsALiveItem = subscriberTimeStamp&lt; T.TimeStamp

这使我在视图中更简单。 让主题成为告诉你它是否被重播/现场(而不是客户端通过比较TimeStamps来解决它)的唯一方法是编写自己的自定义重播主题。 这将是'OnSubscribe',提供一个新的观察者及其缓存的项目,包含在一个'bool = true'的类中,然后是'OnNext'中的任何未来项目,'bool = false'。但是,您需要: a)缓存以前的项目 b)缓存订户 c)管理处理更新的相当大的复杂性,同时将初始缓存重播给订户(有效地维护每个订户的缓存)。

这让我感到非常复杂,没有真正的好处。保持简单,只需使用时间戳。

Howard Andresier

P.S。可以通过将ReplaySubject包装在容器类中来解决'IsStarted'要求。这个类可以公开底层的IObservable,但也保持自己的订阅,它在观察第一个项目时将本地bool'IsStarted'设置为true。 外部呼叫者可以随时使用主题,或评估“IsStarted”布尔值。