2016-11-07 14 views
0

私は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); 
     } 
    } 

答えて

0

はちょうど私がこの問題に他人を参照するために上記の経験の問題に私の解像度を追加したい

NewsService.cs。

キャッシュしようとしていたオブジェクトにHttpResponseMessageが含まれていました。シリアル化エラーが発生している可能性があります。おそらく循環参照で、キャッシュされず、毎回エンドポイントを呼び出すことになりました。私はそのプロパティに[IgnoreDataMemberAttribute]を置くことになったので、シリアル化されず、問題はなくなりました。

エラーを処理し、IsBusyプロパティにバインドされているアクティビティインジケータが正しく更新されていることを確認するため、次のように購読を処理しました。

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 DisplayActivitiesでのObservableCollectionに更新がUIに見られていることを確認するために使用されています。

関連する問題