我有「顯著變化」篩選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