如何在Akavache中订购新价值?

时间:2018-12-01 19:24:31

标签: xamarin xamarin.forms cross-platform akavache

我正在使用Akavache的GetAndFetchLatest方法,并且创建了依赖项服务以与Akavache的方法进行通信。当我直接引用时,我成功地从服务层调用了akavache。订阅

  MyMod result = null;
                var cache = BlobCache.LocalMachine;
                var cachedPostsPromise = cache.GetAndFetchLatest(
                    "mykey",
                    () => GetInfo(),
                    offset =>
                    {
                      //some condition
                    });

                    cachedPostsPromise.Subscribe(subscribedPosts => {
                        Device.BeginInvokeOnMainThread(() =>
                        {
                           //do sothing.

                        });
                });

                result = await cachedPostsPromise.FirstOrDefaultAsync();
                return result;

它有效。但是我如何通过接口/依赖服务调用服务层上的订阅?

2 个答案:

答案 0 :(得分:0)

我认为您是反应式编程的新手。使用Akavache时,了解基本原理会有所帮助。也许this intro会有所帮助。

要回答您的问题,请将这样的代码放在“存储库”类中:

public override IObservable<MyClass> Get(string key)
{
    var cachedObservable = blobCache.GetAndFetchLatest<MyClass>(key,
        () => GetFromServerAsync(key));
    return cachedObservable ;
}

在呼叫者中:

private void getNewData()
{
    var myClassObservable = myRepository.Get("the key");
    myClassObservable.Subscribe(handleNewMyClass);
}

private void handleNewMyClass(MyClass newClass)
{
    //handle the new class
}

请注意,handleNewMyClass()被调用了两次:

  1. 首先使用来自缓存的MyClass
  2. 然后使用从服务器中获取的MyClass

使用这种方法,您只需将存储库类放入IoC容器中即可。

答案 1 :(得分:0)

请找到示例代码:

var result = BlobCache.LocalMachine;
            var cachedPostsPromise = cache.GetAndFetchLatest(
                "mykey",
                () => ViewModelLocator.GetInstance<IYourServiceName>().MethodName(),
                offset =>
                {
                  //some condition
                });

                cachedPostsPromise.Subscribe(subscribedPosts => {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                       //Your piece of code

                    });
            });

            result = await cachedPostsPromise.FirstOrDefaultAsync();
            return result;

请注意,已订阅的内部任何内容都将被调用两次:第一组数据将被缓存,第二组数据将从服务器中新获取。您必须进行管理。