2017-12-24 18 views
0

ReactiveCommandには、出力として整数を生成します。サブスクリプションの前にToPropertyを実行

public ReactiveCommand<Unit, int> Calculate { get; } 

このコマンドからの最新の結果は、その出力はLatestValueに格納され、ObservableAsPropertyHelper

private readonly ObservableAsPropertyHelper<int> _latestValue; 
public int LatestValue => _latestValue.Value; 
... 
Update.ToProperty(this, vm => vm.LatestValue, out _latestValue); 

Calculateが実行されるたびに使用して変数に格納されます。私はこのような何かするとき はしかし、私は、問題が発生します。この観察できるから

anotherObservable.SelectMany(_ => Calculate.Execute()) 
    .Select(value => value == LatestValue); 

結果がセレクト()ObservableAsPropertyHelperアップデートLatestValue前に実行されるため、常にfalseであると思われるが、そのためLatestValueは時代遅れの値を持っています。

これは、observableが値を生成するときに関数を実行したいので、この関数はCalculateから最新の値を必要とするため、問題です。私は観測値から新しい値を渡すことはできません、それは変数にある必要があります。

Calculateを実行してからWhenAnyValueを使用してLatestValueの更新を待つことについて考えました。しかし、これは前回の実行によって更新が引き起こされる可能性があり、一般的には悪い設計のように見えるため、エラーが発生しやすくなります。

この問題を解決する最善の方法は何ですか?

+0

最新の値を格納する目的は何ですか?連続して 'Calculate'を複数回実行する場合に最新の値を取得することを保証することですか? –

+0

実際には、Calculateはビューモデルを検証する関数です。この関数は非常にコストがかかり、ビューモデルの有効性はコードの複数の場所でチェックされます。コードベース内のいくつかの関数は非反応的なので、observableを使うことはできませんが、最新の値が必要です。 – Wouter

答えて

1

WhenAnyValueLatestValueプロパティで使用するのが最善の解決策のようです。そうすれば、あなたはいつでも最新の価値しか持てないと確信しています。

あなたが言及しているように、あなたは競合状態に陥ります。私は、同じ場所での作業が基本的に同じではないことを避けるのが最も良いと思います。 OAPHがそれから設定して作業させてください。

WhenAnyValueSkip(1))の最初の信号をスキップして、プロパティの現在の値がすぐに返されるようにしたい場合があります。

関連する問題