订阅 Observable 时发布最后收到的数据

Publishing last recieved data when Observable is Subscribed

我在 Windows Phone 8 中使用 Rx 创建了 GeoCoordinateReactiveService。 问题是我需要在订阅 Observable 之前启动 Geocoordinatewatcher,它正在观察 PositionChange 事件。

因此,如果在我第一次订阅之前触发位置更改事件,我将不会获得最后的数据。我怎样才能改变当前的实现来做到这一点。

下面是我当前的代码:

 this.StatusObservable = Observable
            .FromEventPattern<GeoPositionStatusChangedEventArgs>(
                handler => geoCoordinateWatcher.StatusChanged += handler,
                handler => geoCoordinateWatcher.StatusChanged -= handler)
            .Select(ep => ep.EventArgs.Status);

 this.PositionObservable = Observable
            .FromEventPattern<GeoPositionChangedEventArgs<GeoCoordinate>>(
                handler => geoCoordinateWatcher.PositionChanged += handler,
                handler => geoCoordinateWatcher.PositionChanged -= handler)
            .Select(ep => ep.EventArgs.Position);

geoCoordinateWatcher.Start();


geoCoordinateService.StatusObservable
            .ObserveOnDispatcher()
            .Subscribe(this.OnStatusChanged);

geoCoordinateService.PositionObservable
            .ObserveOnDispatcher()
            .Subscribe(this.OnPositionChanged);

选项 1

在开始你的观察者之前订阅:

geoCoordinateService.StatusObservable
            .ObserveOnDispatcher()
            .Subscribe(this.OnStatusChanged);

geoCoordinateService.PositionObservable
            .ObserveOnDispatcher()
            .Subscribe(this.OnPositionChanged);

geoCoordinateWatcher.Start();

鉴于您提供的信息有限,我没有理由认为这是不充分的。

选项 2

使用 Replay 定义一个 IConnectableObservable<T>,然后 Connect 在启动你的观察者之前:

var status = geoCoordinateService.StatusObservable.Replay(1);
var position = geoCoordinateService.PositionObservable.Replay(1);

var statusConnection = status.Connect();
var positionConnection = position.Connect();

geoCoordinateWatcher.Start();

status.ObserveOnDispatcher().Subscribe(this.OnStatusChanged);
position.ObserveOnDispatcher().Subscribe(this.OnPositionChanged);

如果您确实需要在启动观察程序之后执行订阅,则第二个选项是必需的。