首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akavache总是调用fetchFunc

Akavache总是调用fetchFunc
EN

Stack Overflow用户
提问于 2016-11-07 21:33:02
回答 1查看 312关注 0票数 0

我在Xamarin应用程序中使用Akavache编写了下面的代码,它的行为并不像我想的那样。可能是我对该怎么做的误解,但这让我发疯了。

因此,在我的视图模型中,我调用FetchNewsCategories并为该项指定5分钟的缓存。我希望发生的是,如果缓存项不存在,它将调用fetchFunc (即。但是,如果我在缓存超时5分钟内多次调用该服务,它应该只给我缓存的项,而不是服务器调用。在我尝试过的所有情况下,它都会继续执行rest调用,而不会给我缓存的项。我也在GetAndFetchLatest中尝试过这一点,如果有缓存的项,它不会进行rest调用,但是它也不会在视图模型中的订阅事件中进行调用。知道我在这里做错什么了吗?

编辑:我在Android上测试了同样的代码(Nexus 5 KitKat API19),它运行得非常完美。我要重置我的IOS仿真器,看看是不是有什么不对劲。

NewsService.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 16:00:19

只是想把我的解决方案加到我上面遇到的问题上,以供其他有这个问题的人参考。

我试图缓存的ServiceResponse对象中有一个HttpResponseMessage,我怀疑它会导致序列化错误,可能是一个周期性引用,所以它从来没有缓存过,每次都会调用端点。最后,我在该属性上放置了一个[IgnoreDataMemberAttribute],所以它没有被序列化,问题就消失了。

最后,我以以下方式处理订阅,以处理错误,并确保绑定到IsBusy属性的活动指示符被正确更新。

代码语言:javascript
复制
public async Task LoadActivities(bool refresh)
    {

        IsBusy = true;

        if (refresh) OlderThanJournalId = int.MaxValue;

        var cached = ActivityService.FetchJournalItems(GroupId, OlderThanJournalId, refresh);

        cached.Subscribe((result) => { Device.BeginInvokeOnMainThread(() => { 
            DisplayActivities(result); 
        }); }, (err) => HandleError(err), () => IsBusy = false);

    }

public void HandleError(Exception ex) {
        IsBusy = false;
        DialogService.ShowErrorToast(AppResources.ErrorMessage, "Unable to load activity stream.");
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

private void DisplayActivities(ServiceResponse<List<JournalItem>> response)
    {
        if (!response.IsConnected) {
            DialogService.ShowInfoToast(AppResources.ErrorMessage, AppResources.NotConnected);
            return;
        }
        if (!response.Authorized) {
            App.LoginManager.Logout();
        }
        Activities.Clear();
        foreach (var item in response.Result)
        {
            Activities.Add(item);
        }
    }

BeginInvokeOnMainThread用于确保在UI中看到对ObservableCollection在DisplayActivities中的更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40475039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档