La importancia de la optimización
Cuando desarrollamos aplicaciones móviles, siempre tenemos en cuenta el dispositivo final donde se va a ejecutar, es decir, las optimizaciones a diferentes niveles se encuentran a la orden del día. Hablamos de opciones como cachear imágenes, reutilizar celdas en listados o compilar el XAML entre una infinidad de opciones.
Por otro lado, la mayoría de aplicaciones necesitan guardar datos como caché para optimizar arranques o bien, para evitar volver a realizar peticiones HTTP innecesarias. En este artículo, vamos a conocer y a utilizar Monkey Cache de James Montemagno.
Cachear datos
Mientras que tenemos diferentes opciones para cachear imágenes, cachear información es algo donde hay diversidad de opciones. A continuación, vamos a conocer Monkey Cache, una forma sencilla y potente de cachear información durante un periodo de duración concreto.
Monkey Cache
Monkey Cache tiene como objetivo permitir cachear información de forma sencilla, sin requerir gran cantidad de dependencias controlando el tiempo de caducidad de los datos. Es importante resaltar que la librería no tiene como objetivo gestionar peticiones HTTP, esstados, etc. tan solo cachear la información.
Estamos ante una librería NET Standard 2.0 con el siguiente soporte a plataformas:
Platforma | Versión |
---|---|
Xamarin.iOS | iOS 7+ |
Xamarin.Mac | All |
Xamarin.Android | API 14+ |
Windows 10 UWP | 10.0.16299+ |
.NET Core | 2.0+ |
ASP.NET Core | 2.0+ |
.NET | 4.6.1+ |
Utilizando Monkey Cache
Vamos a utilizar la aplicación WeatherApp para controlar las diferentes peticiones a la API de OpenWeatherMap.org.
Comenzamos añadiendo los paquetes NuGet necesarios. Monkey Cache cuenta con diferentes implementaciones como SQLite, LiteDB o FilesStore.
En nuestro ejemplo, vamos a utilizar la opción más sencilla (y con menos dependencias), FileStore.
Tras contar con los paquetes necesarios, continuamos creando un identificador de aplicación utilizando la propiedad ApplicationId, que se encargará de crear una carpeta específica para la aplicación en disco:
Barrel.ApplicationId = "com.refractored.weatherappmonkeycache";
Veamos como utilizar Monkey Cache.
if (!Barrel.Current.IsExpired(key: location)) { weatherRoot = Barrel.Current.Get<WeatherRoot>(key: location); Forecast = Barrel.Current.Get<WeatherForecastRoot>(key: weatherRoot.CityId.ToString()); } else { weatherRoot = await WeatherService.Instance.GetWeatherAsync(location); Barrel.Current.Add(key: location, data: weatherRoot, expireIn: TimeSpan.FromHours(1)); Forecast = await WeatherService.Instance.GetForecast(weatherRoot.CityId); Barrel.Current.Add(key: weatherRoot.CityId.ToString(), data: Forecast, expireIn: TimeSpan.FromHours(1)); }
La aplicación verificará si los datos han expirado o no. En caso de expirar o no existir, realiza la petición HTTP. Al realizar la petición HTTP, añadimos en cache los datos durante 1 hora (expireIn). Si los datos no han expirado, utilizamos los datos cacheados evitando realizar la petición HTTP.
Sencillo, ¿verdad?.
NOTA: Es posible hacer estas llamadas genéricas para reutilizar en diferentes servicios.
La librería conservará datos a menos que indiquemos que deseamos borrarlos. Podemos borrar todos los datos:
Barrel.Current.EmptyAll();
O podemos eliminar todos los datos expirados:
Barrel.Current.EmptyExpired();
Tienes el código fuente del ejemplo disponible GitHub:
Me he quedado con dudas…
El uso de la librería es sencillo, pero…¿diferencias con Akavache?. Akavache ofrece persistencia en forma de clave-valor con un rendimiento muy alto utilizando SQLite y Reactive Extensions. Monkey Cache busca simplificar uso, gestión de la expiración y dependencias.
Más información
- GitHub: monkey-cache
- Blog de James Montemagno: Data Caching Made Simple with Monkey Cache ? for .NET
- Merge Conflict: Merge Conflict 76: We Can’t Solve Everyone’s Problem