如何订阅 Akavache 中的新值?

How to subscribe new value in 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;

它 works.But 我如何使用 interface/dependency 服务在服务层上调用订阅?

我认为你是响应式编程的新手。了解基本原理有助于使用 Akavache。也许 this intro 有帮助。

要回答您的问题,请将这样的代码放入您的 "repository" class:

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

使用这种方法,您可以简单地将存储库 class 放入您的 IoC 容器中。

请查找示例代码:

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;

请注意,订阅中的任何内容都会被调用两次:第一组数据将被缓存,第二组数据将从 server.You 中重新获取,必须根据需要进行管理。