【发布时间】:2016-09-07 19:22:45
【问题描述】:
我有一个GeoLocationProvider(它实现了IObservable<System.Device.Location.GeoCoordinate>,它每 x 毫秒输出一次当前位置。
现在我想使用 RX 读取所有这些 GPS 坐标,并且仅在位置变化重大时(例如 - 行驶距离 > 10 米)通知订阅者。
我的“主要”代码
// [...]
IObservable<GeoCoordinate> locationProvider = new GeoLocationProvider();
LocationFeed locationFeed = new LocationFeed(locationProvider);
// register any interested observers on the locationFeed.
ConsoleLocationReporter c1 = new ConsoleLocationReporter("reporter0001");
locationFeed.Subscribe(c1);
我的 LocationFeed 实现如下所示:
using System;
using System.Device.Location;
using System.Reactive.Subjects;
namespace My.Namespace.Movement
{
public class LocationFeed : ISubject<GeoCoordinate>, IDisposable
{
private readonly IDisposable _subscription;
private readonly Subject<GeoCoordinate> _subject;
public LocationFeed(IObservable<GeoCoordinate> observableSource)
{
_subject = new Subject<GeoCoordinate>();
_subscription = observableSource.Subscribe(_subject); // TODO: Add logic to filter to only significant movement changes (> 10m)
}
public void Dispose()
{
_subscription?.Dispose();
_subject?.Dispose();
}
public void OnNext(GeoCoordinate value)
{
_subject.OnNext(value);
}
public void OnError(Exception error)
{
_subject.OnError(error);
}
public void OnCompleted()
{
_subject.OnCompleted();
}
public IDisposable Subscribe(IObserver<GeoCoordinate> observer)
{
return _subject.Subscribe(observer);
}
}
}
问题一: GeoCoordinate 提供了一个方法c1.DistanceTo(c2) 来计算两个坐标之间的距离。如果阈值与上次推送的阈值相比大于 x,我只想报告(发布)新的地理坐标。我如何做到这一点?
问题2:主题的使用是否正常,以及我实现ISubject的方式?我不想在我的“主”代码中添加所有连线并将其全部移到单独的类中。
【问题讨论】:
-
如果您想获得完整的答案,我很乐意提供进一步的帮助,但您能否提供测试以显示您想要的内容以及缺少的
GeoCoordinate类 -
我同意 Lee 的观点——不要实现你自己的实现 Rx 接口的类。这样做只会带来坏事。
标签: c# system.reactive observable