2013-04-10 46 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