這是我有:如何在將任務作爲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.
實際上,我認爲你需要'PublishLast',因爲它會將緩存的結果重播給新的觀察者。你不一定需要使用'Connect';你可以改用'RefCount'或'selector'超載(後者在大多數情況下更可取)。 –
@DaveSexton在使用任務時,PublishLast或Publish不會有什麼區別嗎? (只有1個結果)。你可以舉一個關於如何使用RefCount或選擇器的例子嗎? –
親自試一試。收到通知後,再次在'Publish'可觀察值上調用'Subscribe'。現在,你是否再次觀察到緩存通知? http://davesexton.com/blog/post/Hot-and-Cold-Observables.aspx –