订阅 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);
如果您确实需要在启动观察程序之后执行订阅,则第二个选项是必需的。
我在 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);
如果您确实需要在启动观察程序之后执行订阅,则第二个选项是必需的。