2014-11-13 86 views
0

這是我有:如何在將任務作爲Observable重試時緩存任務的結果?

CitiesObservable = Observable 
        .FromAsync(apiClient.GetCitiesTask) 
        .Retry(); 

apiClient.GetCitiesTask返回類型的任務:Task<List<City>>

的問題是,我每次用戶添加到可觀察的時間,apiClient.GetCitiesTask被再次調用。結果成功完成後,如何緩存結果?

感謝

問題重新措辭

我想apiClient.GetCitiesTask被稱爲按需(直到它不會失敗)多次,但一旦成功,所有的後期用戶應該使用緩存的結果。

結論

2解決方案出現,一個我發現和其它(所選擇的回答)。

溶液A:(實際上幾乎是溶液)

CitiesObservable = Observable.FromAsync(apiClient.GetCitiesTask).Publish(); 
CitiesObservable.Connect(); 
// Then you can subscribe as you want. But! you won't receive the cached value on late subscribers, only the onCompleted signal. 

溶液B:(由@Bluesman)

CitiesObservable = Observable.StartAsync(
    () => Observable.FromAsync(apiClient.GetPlacesTask<City>).Retry().ToTask() 
); 
// Then you can subscribe as you want. 
+0

實際上,我認爲你需要'PublishLast',因爲它會將緩存的結果重播給新的觀察者。你不一定需要使用'Connect';你可以改用'RefCount'或'selector'超載(後者在大多數情況下更可取)。 –

+0

@DaveSexton在使用任務時,PublishLast或Publish不會有什麼區別嗎? (只有1個結果)。你可以舉一個關於如何使用RefCount或選擇器的例子嗎? –

+0

親自試一試。收到通知後,再次在'Publish'可觀察值上調用'Subscribe'。現在,你是否再次觀察到緩存通知? http://davesexton.com/blog/post/Hot-and-Cold-Observables.aspx –

回答

0

什麼....

Observable 
    .StartAsync(() => Observable 
     .FromAsync(reserbusAPI.GetPlacesTask<City>) 
     .Retry() 
     .ToTask()); 

外部StartAsync確保創建的任務的最終結果被緩衝,而內部的FromAsyncRetry確保GetPlacesTask根據需要多次調用。然而,即使在第一次訂閱之前,整個重試事件仍然開始。

+0

只要後期用戶獲得緩存的結果,這將是我所看到的;我不需要它是懶惰的。我會在一個小時左右登記。 –

+0

很久以後......它的工作!非常感謝。 –