1

ユーザーの現在地と目的地までのポリライン (運転する場所を示すもの) を描画するナビゲーション アプリを想像してみてください。つまり、2 つのイベント ストリームが必要です。1 つは位置の更新用で、もう 1 つは位置の更新に基づいて新しく計算されたポリライン用です。

問題は、ポリラインを描画するのに計算コストがかかることです。そのため、ユーザーが計算された最後のポイントから一定の距離を移動した後にのみ実行したいと考えています。

これがどのように機能するかは次のとおりです。

  1. 赤 - ユーザーが少し移動しても何も起こらない
  2. 青 - ユーザーは、方向が計算されたときの元のポイントからの距離である緑の円の外に移動し、その結果、新しい方向が計算され、新しいオレンジ色の半径が設定されます

ナビゲーション

ここでの問題は、次の計算を引き継ぐ方法がわからないことです。ある種の折りたたみが必要になると思いますが、Rxでそれを表現する方法がわかりません。

これは次のようになります (where の 2 つの引数は、ある種のタプルを意味します)。

locationUpdates.Where((previous, current) => IsFarEnough(previous, current))
               .SomethingThatPutsCurrentBackIntoTheCondition()
4

1 に答える 1

4

Observable.Scan は、現在のアイテムと以前のアイテムを折りたたんだり比較したりする最も簡単な方法です。私はいくつかの素敵な図でこれについてここにブログを書きました。その記事のコードは次のとおりです。

public static IObservable<Tuple<TSource, TSource>>
    PairWithPrevious<TSource>(this IObservable<TSource> source)
{
    return source.Scan(
        Tuple.Create(default(TSource), default(TSource)),
        (acc, current) => Tuple.Create(acc.Item2, current));
}

そしてそれの単体テスト:

public class PairWithPreviousTests : ReactiveTest
{
    [Test]
    public void Works()
    {
        var testScheduler = new TestScheduler();

        var source = Observable.Range(1, 3);

        var results = testScheduler.Start(
            () => source.PairWithPrevious());

        results.Messages.AssertEqual(
            OnNext(Subscribed, Tuple.Create(0, 1)),
            OnNext(Subscribed, Tuple.Create(1, 2)),
            OnNext(Subscribed, Tuple.Create(2, 3)),
            OnCompleted<Tuple<int, int>>(Subscribed));
    }
}

これをハックして、スキャンを使用して必要なものを進める方法を確認できるはずです。

于 2013-10-26T15:38:48.697 に答える