私はAkavacheをXamarinアプリケーションで使用していますが、それは私が思うように動作しません。おそらくそれがどうあるべきかという私の誤解が、私を狂ってしまう。Akavacheは常にfetchFuncを呼び出します
私のビューモデルでは、FetchNewsCategoriesを呼び出して、アイテムのキャッシュを5分指定しています。私は何が起こると思いますが、キャッシュ項目がなければ、fetchFunc(すなわちFetchNewsCategoriesAsync)を呼び出しますが、5分のキャッシュタイムアウト内で何回もサービスを呼び出すと、キャッシュされたアイテムを私に渡して、サーバコールをしないでください。私が試したすべてのケースで、それは残りの呼び出しを続けて、私にキャッシュされたアイテムを与えることはありません。また、GetAndFetchLatestでこれを試してみました。キャッシュされた項目がある場合、残りの呼び出しは行いませんが、viewmodelのsubscribeイベントで呼び出しを行うことはありません。 ここで間違っていることは何ですか?
EDIT:この同じコードをAndroid(Nexus 5 KitKat API19)でテストしたところ、問題なく動作しています。私は私のIOSエミュレータをリセットして、何かがちょうど駄目になっていないかどうかを調べるつもりです。
public static async Task<ServiceResponse<List<ArticleCategoryInfo>>> FetchNewsCategoriesAsync(BlogSourceType blogSource)
{
return await ServiceClient.POST<List<ArticleCategoryInfo>>(Config.ApiUrl + "news/categories", new
{
ModuleId = Int32.Parse(Config.Values[blogSource == BlogSourceType.News ? ConfigKeys.KEY_NEWS_MODULE_ID : ConfigKeys.KEY_BLOG_MODULE_ID])
});
}
public static IObservable<ServiceResponse<List<ArticleCategoryInfo>>> FetchNewsCategories(BlogSourceType blogSource)
{
var cache = BlobCache.LocalMachine;
var cachedCategories = cache.GetOrFetchObject("categories" + blogSource,
async() => await FetchNewsCategoriesAsync(blogSource),
DateTime.Now.AddMinutes(5));
return cachedCategories;
}
NewsViewModel.cs
public async Task LoadCategories()
{
var cachedCategories = NewsService.FetchNewsCategories(blogSource);
cachedCategories.Subscribe((obj) => { Device.BeginInvokeOnMainThread(() => DisplayCategories(obj.Result,"Subscribe"));});
return;
}
private void DisplayCategories(IList<ArticleCategoryInfo> categories, string source)
{
Categories.Clear();
System.Diagnostics.Debug.WriteLine("Redisplaying categories from " + source);
foreach (var item in categories)
{
Categories.Add(item);
}
}