2012-05-15 2 views
0

좋아요. 반응성 확장이있는 다른 게임, 특히 wp7이있는 게임입니다. 나는하여 GeoCoordinateWatcher의 높은 게재 순위 찾고 있어요WP7 - RX를 사용하면 구독 만 트리거되지만 OnNext()는 항상 트리거링합니까?

나는 그렇게

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

앱 실행처럼 가입하고 있지만, 문제가 발생에서만 구독 측의 코드 그래서

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); 
    } 
}; 

같은 이벤트를 변경 한 번은 아직 내가 주제에 중단 점을 넣으면 .NextNext (newLocation), 나는 끊임없이 그 트리거가 발생하는 것을 본다.

내가 뭘 잘못하고 있니?

[편집]

내가 잘못 무엇인지 볼 수 있습니다 좋아, (그냥 학습 내 메신저되지 않습니다) 코드, DistinctUntilChanged()를 사용합니다. 간단히 읽는 것에서 이것으로 구독자에게 동일한 가치가 나오는 것을 멈출 것이라고 가정합니다. 그래서 내가 전화를 사용하고있는 위치, 위치 추적, 전화가 같은 위치에 있고 GeoCoordinate가 변경되지 않았다면 구독자에게 보내는 것은 무의미 할 것입니다.

+0

이 두 코드 스 니펫의 관련성에 대한 정보는 도움이됩니다. 첫 번째 스 니펫은 MyLocation입니다 .StartGettingLocations는 두 번째 코드에서 참조됩니까? –

+0

죄송합니다. 직장을 떠나기 전에 빨리 생각해보십시오. 편집에서 볼 수 있다면 문제를 이해해야합니다. – Gaz83

+0

@ Gaz98 : 당신이 맞습니다. 값이 변경되지 않으면 관찰자에게 새로운 값을 제공하지 않습니다. .DistinctUntilChanged() 비헤이비어를 제거하면 동일한 값이 옵저버에 푸시됩니다. –

답변

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로 변환하면됩니다. Observables를 사용하고 있기 때문에 현재보다 훨씬 많은 작업을 수행 할 수있는 다수의 연결자에 액세스 할 수 있습니다.

+0

와우! 나는이 코드를 사용하여 내가 따라야하는지 다시 한번 고마워 할 것이다. – Gaz83

관련 문제