(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
}
我对移动开发和 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
}