A día de hoy es difícil encontrar aplicaciones móviles que no se conecten a un backend para recibir datos y actualizar los que tenemos en nuestro dispositivo guardado.
Lógicamente guardamos datos para muchas ocasiones, una de las cuales es que nuestro querido usuario no tenga una mala experiencia o no pueda utilizar la aplicación por el simple hecho de no tener acceso a internet.
Obviamente, hay circunstancias que hacen imposible ofrecer una buena experiencia si nuestra aplicación está basada en la actualización constante desde nuestro backend, pero hay otros momentos en los que podemos ir un paso más allá y dejarle datos para que, aun sin acceso a la red, pueda disfrutar de su aplicación.
Trabajando con ReactiveUi podemos hacer uso de muchos modos para tener nuestra caché trabajando y facilitándonos la vida, pero hoy le toca el turno a Akavache, un servicio de caché que se integra perfectamente con nuestro framework favorito, ReactiveUi, ya que nos da, entre otras muchas opciones, la posibilidad de jugar con objetos Observable y claro, esto nos proporciona herramientas para hacer un uso intensivo de Functional Reactive Programming.
Hoy quiero escribir sobre una funcionalidad que me parece una genialidad por parte de su creador, Paul Betts, GetAndFetchLatest.
Esta funcionalidad nos devuelve lo que tengamos en la caché, pero además nos hace una segunda devolución con los datos actualizados desde nuestro backend. Esto nos da una ventaja importante, servimos de modo inmediato los datos que tenemos en caché y si es necesaria una actualización inmediata de nuestros datos, se conecta a nuestro backend y, como nos devuelve un Observable, nos podemos subscribir y realizar una actualización de nuestra pantalla sin que el usuario necesite hacer ninguna acción.
Vamos a ver un poco de código:
Como puedes ver, tenemos dos parámetros opcionales en el método y es ahí donde radica la magia. Si no le configuramos nada para nuestro parámetro fetchPredicate, siempre va a realizar la llamada a nuestro backend.
Ahora imagina que nuestra llamada tarda más de lo que queremos o simplemente quieres retrasar la actualización por el motivo que se te ocurra. Para esto configuramos el fetchPredicate y, una vez que se actualice la información, la tenemos disponible de nuevo para mostrarla a nuestro usuario o tenerla en caché para la siguiente vez que la necesitemos, eso ya es una decisión que dependerá de cada circunstancia.
Vamos a ver cómo configuramos el método para configurar la actualización:
Desde nuestro método Delay() hacemos la suscripción al Observable que nos devuelve DelayUpdate() y le he configurado que compruebe si ha pasado un minuto desde la última vez que hice la petición. Si nos devuelve true, ejecutará nuestro GetData(). Cuidado, esto no significa que cada minuto va a realizar una llamada para actualizar los datos, eso tendrías que configurarlo de otro modo. Esto lo que hace es comprobar la última petición y en base al tiempo configurado hacer una nueva llamada.
Y listo, de este modo realizamos nuestra actualización de caché y tenemos la opción de guardarlo o actualizar nuestra pantalla, eso, como siempre en desarrollo, depende.