(Xamarin)应用程序中 REST 调用的本地预加载和缓存层以减少等待?

Local pre-load and caching layer for REST calls in (Xamarin) apps to reduce wait?

我对移动开发和 Xamarin 比较陌生。我正在制作一个完全依赖于 REST API 的应用程序,很明显,在应用程序周围单击是一种非常糟糕的体验,因为尽管它们速度非常快,但负载持续不断。

我提出的解决方案是在用户加载应用程序时异步调用许多 get 端点,然后缓存一小段时间。

我自己可以很容易地实现这个,但我最终会重新投资轮子来解决我认为每个使用 REST API 的应用程序都有的问题。

所以我的问题是

在 (Xamarin) 应用程序中预加载和缓存 REST 数据的最常见方法是什么?

是不是在app本地服务区之间做一个缓存层,然后启动一个异步任务,缓存我们期望用户打开的端点?

您可以制作一个基于缓存的图层。您需要考虑是希望它仅保留在内存中还是同时保留在内存和磁盘中。

我展示了一个多级(内存、磁盘、网络)缓存系统。我已经成功地使用了这个架构。它适用于单例 class 和 c# 事件。可以有很多订阅者 给处理人员。所以一个 UI screen 可以在数据可用时订阅接收,并且可以回调多次 每个请求。设计是它 returns 尽可能快地获取数据(首先从内存中获取),但仍然会调用磁盘和网络来刷新数据。 UI 可能会被回调多次,因为它会使用内存中的数据快速回调,然后在网络请求完成后再次回调。为了帮助线程安全,您可以使用锁或使用线程安全集合,如 ConcurrentDictionary 或 ConcurrentQueue。还有很多边缘情况需要考虑,但这是具有事件的多级缓存系统的基本架构。

// pseudo code
class CacheHelper
{

   // todo: create singleton

RequestData()
{

    if ( data in memory)
    {
        // this quickly gets the app some data
        Fetch data from dictionary/list/etc
        NotifySubscribers( this, data)
    }

    if ( data in disk )
    {
       // this gets data persisted after user force closes app then reopens
        Fetch data from sqlite, file storage, etc
        NotifySubscribers( this, data) 

        copy data from disk to memory
    }

    // always request data from server too to keep it fresh
    RequestLatestDataFromServer();  // you can put a cap on this to limit network requests
}

HandleRequestLatestDataFromServerComplete( obj, args)
{
    // this is the data returned from server
     ALSO copy server result to memory and copy to disk

     NotifySubscribers( this, data);

}



/// To use this in a UI class
ViewDidAppear()
{
   CacheHelper.Instance.HandleRequestLatestDataFromServerComplete += ReceivedData;
}

ViewWillDisappear()
{
   CacheHelper.Instance.HandleRequestLatestDataFromServerComplete -= ReceivedData;
}


void ReceivedData(Object obj, EventArgs args )
{
     // update your UI
     // This may get called a few times,  for each level of cache retrieved
}