0

特にwp7を使用して、リアクティブエクステンションで別のプレイをしています。

私はGeoCoordinateWatcherの位置変更イベントを見ています

var subject = new BehaviorSubject<GeoCoordinate>(GeoCoordinate.Unknown);
var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default) { MovementThreshold = 0 };

watcher.PositionChanged += (o, args) =>
{
   var newLocation = args.Position.Location;

   if ((DateTime.Now - args.Position.Timestamp.DateTime) < locationTimeout)
   {
        subject.OnNext(newLocation);
    }
};

私はそのように購読しています

MyLocation.StartGettingLocations()
 .Subscribe(pos =>
 {
       // Do something with the position
       PlotLine.Locations.Add(pos);
       bingMap.SetView(pos, 15);
 });

アプリは実行されますが、問題はサブスクライブ内のコードが 1 回しか発生しないことです。サブジェクトにブレーク ポイントを設定すると、常にトリガーされることがわかります。

私は何を間違っていますか?

[編集]

わかりました、何が間違っていたかがわかります。コード (これは私のものではありません) は、DistinctUntilChanged() を使用しています。簡単に読んだことから、これは同じ値がサブスクライバーに送り出されるのを止めると思いますか? 電話が同じ位置にあり、GeoCoordinateが変更されていない場合、私がそれを使用していた目的、位置追跡に関しては、それをサブスクライバーに送信しても意味がないので、それを防ぐだけですか?

4

1 に答える 1

3

コメントで質問に答えていると思います(つまりDistinctUntilChanged、ユーザーが移動していなくても場所が必要な場合は削除してください)。ただし、この質問には気になる点がありました.Rxを使用していますが、特に効果的ではありません.

まず、イベントをオブザーバブルに変換するはるかに簡単な方法があります (これにより、操作が簡単になります)。

var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default) { MovementThreshold = 0 };  
var geo = Observable.FromEventPattern<GeoPositionChangedEventArgs<GeoCoordinate>>(
                               ev => watcher.PositionChanged += ev, 
                               ev => watcher.PositionChanged -= ev)
                    .Select(ev => ev.EventArgs.Position);

次に、変更を取得するために、その命令的なコードは必要ありません。これを行うだけです:

var changes = geo.Where(pos => (DateTime.Now - pos.Timestamp.DateTime) < locationTimeout)
                 .Select(pos => pos.Location)
                 .DistinctUntilChanged();

DistinctUntilChangedもちろん、投稿されたコードには含まれていないものを削除できます)。

changesこれで、次の操作を直接行うことができます。

changes.Subscribe(loc =>
{
   PlotLine.Locations.Add(pos);
   bingMap.SetView(pos, 15);
});

実際には一連のイベントを隠しているだけのサブジェクトを管理する必要はありません。イベントをオブザーバブルに変えるだけです。次に、Observables をずっと使用しているため、現在よりも多くのことを実行できるようにする多数のコンビネーターにアクセスできます。

于 2012-05-15T21:04:33.360 に答える