我在 Xamarin 应用程序中使用 Akavache 有以下代码,但它的行为不像我认为的那样。可能是我对它应该是怎样的误解,但这让我发疯。
因此,在我的视图模型中,我正在调用 FetchNewsCategories 并为该项目指定 5 分钟的缓存。我期望发生的是,如果缓存项不存在,它将调用 fetchFunc(即 FetchNewsCategoriesAsync),但如果我在 5 分钟的缓存超时内多次调用该服务,它应该只给我缓存的项目而不是服务器调用。在我尝试过的所有情况下,它都会继续进行其余调用,并且永远不会给我缓存的项目。我也用 GetAndFetchLatest 试过这个,如果有一个缓存的项目,它不会进行其余的调用,但它也不会在视图模型的订阅事件中进行调用。有什么想法我在这里做错了吗?
编辑:我在 Android (Nexus 5 KitKat API19) 上测试了相同的代码,它运行完美。我要重置我的 IOS 模拟器,看看是不是出了问题。
新闻服务.cs
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);
}
}