在订阅时,我的ReplaySubject订阅者想知道重播历史记录何时结束并成为“实时”订阅。此外,所述订户还希望接收每个项目的通知时间。
我认为唯一的方法是复制ReplaySubject源并使其返回一个包含Timestamped的对象和一个指示RemovableDisposable.IsStarted状态的bool?
除非有人能提出更好的选择吗?
答案 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”布尔值。