2012-05-15 81 views
0

好吧,即時通訊有另一個反應擴展遊戲,特別是wp7。WP7 - 使用RX,訂閱只觸發一次,但OnNext()始終觸發?

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

的應用程序運行,但問題是在邊碼的訂閱僅發生有一次,如果我在主題中放置一個斷點.OnNext(newLocation),我看到它不斷被觸發。

我在做什麼錯?

[編輯]

好吧,我可以看到什麼是錯的,該代碼(這是不是我的我可是從它剛學),使用DistinctUntilChanged()。從簡短的閱讀來看,我認爲這會阻止向用戶流出相同的價值?所以我使用它的位置跟蹤,位置跟蹤,如果電話位於同一位置,並且GeoCoordinate沒有改變,那麼將它毫無意義地發送給訂戶,這樣就可以阻止它?

+0

關於這兩個代碼片段如何相關的一些背景將有所幫助。是第二個引用MyLocation.StartGettingLocations的第一個片段嗎? –

+0

對不起,在我離開工作之前我很快就提出了這個問題。如果你可以從EDIT中看到,我知道這個問題只需要理解它。 – 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,所以您可以訪問多個組合器,這將允許您做比現在更多的操作。

+0

哇!乾杯!我會去使用這段代碼看看我是否遵循,再次感謝。 – Gaz83