2017-12-24 4 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는 오래된 값이 있습니다.

관찰 가능이 값을 생성 할 때 함수를 실행하려고하는데이 함수는 Calculate의 최신 값이 필요하기 때문에 문제가됩니다. 관측 대상에서 새 값을 전달할 수 없으며 변수에 있어야합니다.

Calculate을 실행 한 다음 WhenAnyValue을 사용하여 LatestValue의 업데이트를 기다리는 것과 관련하여 생각했습니다. 그러나 이것은 이전 실행으로 인해 업데이트가 발생할 수 있으며 일반적으로 잘못된 디자인 인 것처럼 보이기 때문에 오류가 발생하기 쉽습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+0

최신 값을 저장하려는 의도는 무엇입니까? 'Calculate'를 연속적으로 여러 번 실행하는 경우 최신 값을 얻을 수 있도록 보장합니까? –

+0

실제로 Calculate는 뷰 모델의 유효성을 검사하는 함수입니다. 이 함수는 꽤 비싸고 viewmodel의 유효성은 코드의 여러 위치에서 검사됩니다. 코드베이스의 일부 함수는 반응이 없으므로 관찰 가능을 사용할 수 없지만 최신 값이 필요합니다. – Wouter

답변

1

WhenAnyValueLatestValue 속성에 사용하는 것이 가장 좋은 해결책 인 것처럼 들립니다. 그렇게하면 언제든지 가장 최근의 가치만을 가질 수 있습니다.

언급했듯이 경쟁 조건이 발생하며 기본적으로 동일한 작업을 동시에 수행하지 않음으로써 피하는 것이 가장 바람직하다고 생각합니다. OAPH가 설정되어 작업하게하십시오.

WhenAnyValue (Skip(1))의 첫 번째 신호를 건너 뛰고 속성의 현재 값이 즉시 반환 될 수 있습니다.

관련 문제