在订阅时,我的 ReplaySubject 订阅者想知道重播历史何时结束并成为“实时”订阅。此外,所述订阅者还希望接收每个项目的通知时间。
我认为唯一的方法是复制 ReplaySubject 源并使其返回一个包含时间戳的对象和一个指示 RemovableDisposable.IsStarted 状态的布尔值?
除非有人能提出更好的选择?
在订阅时,我的 ReplaySubject 订阅者想知道重播历史何时结束并成为“实时”订阅。此外,所述订阅者还希望接收每个项目的通知时间。
我认为唯一的方法是复制 ReplaySubject 源并使其返回一个包含时间戳的对象和一个指示 RemovableDisposable.IsStarted 状态的布尔值?
除非有人能提出更好的选择?
您的重播主题提供的每个项目都应该是一个包含时间戳的包装项目(指示其首次创建时的原始时间)。不要将此与 Observable.TimeStamp() 运算符混淆,后者将为您提供每个通知的最新(实时)时间戳。相反,您希望在项目第一次通过主题播放时记录时间戳,并为任何未来的订阅者重播相同的时间戳。即如果你的 observable 当前是
IObservable<T>, you could change it to be IObservable<TimeStamped<T>>,
使用您自己的自定义 Monad,Rx 'Timestamped' 之一,(或者如果您愿意,也可以只是一个简单的包装类开始)。
一旦你有了这个,我会认为这两个要求都非常简单,但你不需要“布尔”。
相反,您的订阅者可以缓存他们自己的时间戳,代表订阅时间。然后您可以定义:
IsAReplayedItem =subscriberTimeStamp >= T.TimeStamp
IsALiveItem =subscriberTimeStamp < T.TimeStamp
在我看来,这使它更简单。让主题告诉您它是否已重播/直播(而不是客户端通过比较时间戳来解决)的唯一方法是编写您自己的自定义重播主题。这将 'OnSubscribe' 提供一个新的观察者及其缓存项目,用 'bool = true' 包装在一个类中,然后是 'OnNext' 中的任何未来项目,以及 'bool = false'。但是,您需要: a) 缓存以前的项目 b) 缓存订阅者 c) 管理处理更新的相当多的复杂性,同时将初始缓存重播给订阅者(有效地维护每个订阅者的缓存)。
这让我觉得要复杂得多,没有真正的好处。保持简单,只需使用时间戳即可。
霍华德·安德烈西耶
ps 可以通过将 ReplaySubject 包装在容器类中来解决“IsStarted”要求。此类可以公开底层 IObservable,但也可以维护自己的订阅,当它观察到它的第一项时,它将本地 bool 'IsStarted' 设置为 true。然后,外部呼叫者可以使用主题,或随时评估“IsStarted”布尔值。