我有“显著变化”筛选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);
}
}
}
问题1:会有地理座标提供了一种方法c1.DistanceTo(c2)
来计算两个坐标之间的距离。我只想报告(发布)新的GeoCoordinates,如果阈值与上次推送的相比大于x。我如何实现这一目标?
问题2:是否使用主题OK和我实现ISubject的方式?我不想在我的“主”代码中添加所有接线,并将其全部移到单独的类中。
如果你想有一个完整的答案,我很乐意进一步提供帮助,但可能您提供测试以显示您想要的内容以及缺少的“GeoCoordinate”类 –
我同意Lee的观点 - 不要实现您自己的实现Rx接口的类。这样做只会产生不好的结果。 – Enigmativity