Un blog dedicado a la nutrición y el bienestar.

Mejora tu vida

Gestión de estados en el teléfono con Rx

Autor: Ivan Fabijanović, ingeniero sénior de iOS, Proyecto de Vida

Introducción

Los programas de computadora están compuestos de variables (estado) y lógica que cambia esas variables (transformadores de estado). Cuando inicia un nuevo proyecto, generalmente comienza con un estado pequeño y vamos directamente a la lógica. Cuando se necesita una bandera aquí, algo debe sobrevivir al reinicio de la aplicación para que se guarde en el disco, dos subprocesos más tarde necesitan cambiar el mismo objeto y así sucesivamente. A medida que crece la lógica, el estado puede explotar fácilmente en un gran lío. La gestión adecuada del estado (y su crecimiento) es crucial para el desarrollo de aplicaciones sostenibles y extensibles a largo plazo. De lo contrario, se producirán bloqueos, condiciones de carrera, pérdida de datos y, en general, aplicaciones difíciles de mantener.

ReactiveX es una herramienta que podemos usar para reducir en gran medida la complejidad del estado, escribir una lógica más limpia (comprobable) y recuperar el control de nuestra aplicación.

¿Qué es ReactiveX?

Como el Página Oficial dice, «ReactiveX (Rx) es un API para programación asíncrona con flujos observables. Introducir el concepto de Observable lo que cambia fundamentalmente la forma en que pensamos sobre el estado «. Tome este estado muy simple en Swift:

Nada especial aquí, una variable simple que puede asumir dos valores: verdadero o falso. Pero tenga en cuenta que esta variable se define como variable lo que significa que su valor se puede cambiar. Esto introduce una nueva dimensión a este estado: el tiempo. Cada vez que se lee el valor, es potencialmente obsoleto de inmediato, ya que otro proceso podría haber cambiado mientras tanto.

¿De qué color será la vista?

Probablemente azul, pero ¿estamos seguros? No es determinista.

Usando Rx podemos cambiar el estado para que sea una secuencia.

Esto significa que nuestro estado ya no es solo el valor actual, son todos los valores a través del tiempo. Modificamos el ejemplo anterior para usar Rx y devolver el estado con un simple Publicar Asunto implementación.

Ahora, cada vez que se actualiza el estado, todos los suscriptores reciben una notificación y pueden hacer lo que quieran. Esto nos lleva al concepto fundamental con el que las personas que comienzan con Rx tienen problemas: tratar a TODOS como un flujo. La variable es un flujo de valores, el toque de un botón es un flujo de eventos, la animación es un flujo que solo se completa cuando termina. Cuando todo es un flujo, todo se puede componer, unir, transformar, retrasar, reintentar, cancelar, planificar, etc. utilizando las mismas reglas.

Poniéndolo en práctica

La mayoría de las aplicaciones tienen un determinado flujo de inicio de sesión para los usuarios. Un usuario tiene acceso limitado a áreas de la aplicación (y, por extensión, a cualquier servicio consumido por la aplicación) hasta que se conecta a una cuenta de usuario, momento en el que obtiene acceso completo. Una vez conectado, el usuario puede optar por cerrar sesión manualmente o desconectarse de cualquier proceso (por ejemplo, actualización de token fallida), volviendo al acceso limitado.

Seamos realistas: la mayoría de las aplicaciones tienen un tipo de estado isAuthenticated que determina el acceso a diferentes partes de la aplicación para los usuarios y la lógica que cambia este estado (iniciar sesión/cerrar sesión).

Manejar este estado aparentemente simple no es tan simple. Estos son algunos de los problemas que deben abordarse:

  1. El usuario está intentando iniciar sesión -> esperar la confirmación del backend -> estado de actualización -> habilitar la navegación en la parte autenticada de la aplicación
  2. El usuario está intentando registrarse -> esperar la confirmación del backend -> estado de actualización -> habilitar la navegación en la parte autenticada de la aplicación
  3. El usuario cierra la sesión manualmente -> actualiza el estado -> permite navegar a una parte no autenticada de la aplicación
  4. El usuario está tratando de realizar una acción que requiere acceso autenticado -> verificar estado -> puede hacer -> ejecutar acción
  5. El usuario está intentando realizar una acción que requiere acceso autenticado -> verificar estado -> no se puede hacer -> habilitar la navegación en una parte no autenticada de la aplicación
  6. El usuario está intentando realizar una acción que requiere acceso autenticado -> verificar estado -> puede hacerlo -> esperar respuesta del backend -> 401 -> habilitar la navegación en la parte no autenticada de la aplicación
  7. Algunos procesos intentan realizar una acción que requiere acceso autenticado -> verificar estado -> puede hacerlo -> esperar respuesta del backend -> 401 -> habilitar la navegación en una parte no autenticada de la aplicación

Todas las transmisiones leen o cambian de estado y, por lo general, son un efecto secundario de activar la navegación.

El caso 5 es extraño: creemos que podemos tomar medidas, pero luego resulta que no podemos, eso no debería suceder (y puede generar errores desagradables si alguien se olvida de verificar el estado).

El caso 7 es problemático: los procesos que realizan trabajo en segundo plano no deberían preocuparse (o saber) sobre la interfaz de usuario. Imagínese si hay varios ejecutándose cuando ocurre un 401: tenemos que cancelar todo antes de volver al estado no autenticado y no activar varias instancias de navegación, lo que provoca fallas en la interfaz de usuario.

Entonces, ¿cómo puede Rx ayudar a simplificar este problema? Similar al primer ejemplo, comencemos desde el estado. Normalmente hay un tipo Usuario objeto que representa la entidad autenticada.

A continuación, ampliamos la Servicio de autenticación con mutadores de estado:

Las dos primeras funciones cambian el estado presionando uno nuevo Usuario valor, mientras que el cierre de sesión empuja un valor a cero. Esta es toda la información que necesita para configurar una arquitectura de aplicación robusta. El código lógico que requiere acceso autenticado se puede componer en este estado y luego toda la pila de aplicaciones se puede construir en una sola secuencia.

AppDelegate crea una suscripción larga para ti Servicios autenticados fluir y navegar dependiendo de si el valor existe o no. Los métodos definidos en Servicio de autenticación simplemente cambie el estado enviado, por lo que llamar desde cualquier lugar de la aplicación: ya sea la entrada del usuario o una solicitud HTTP fallida desencadenará un cambio que puede desencadenar la navegación.

Los casos 1, 2 y 3 ahora solo necesitan llamar a los métodos de servicio apropiados y tratar los errores. Si tiene éxito, el flujo anterior se encargará de la navegación.

Tenga en cuenta que los servicios se pasan al navegador cuando ingresa al estado autenticado; esto resuelve el caso 5 de manera segura en el momento de la compilación al pasar una instancia no opcional a una parte autenticada de la aplicación. Si el usuario deja de estar autenticado por algún motivo, la navegación habilitada por la secuencia anterior debería tener un efecto en cascada de destrucción de cualquier pantalla autenticada, que a su vez destruye sus objetos DisposeBag, lo que cancela cualquier operación en ejecución, por lo que el caso 7 también está cubierto. . El caso 4 ahora se simplifica solo para tomar medidas; no es necesario verificar nada.

Conclusiones

Rx simplifica la gestión del estado al hacer explícito el componente de tiempo. Las mutaciones de estado se pueden separar claramente de los efectos secundarios, lo que permite cambios controlados en la base del código.

Espero que los ejemplos presentados aquí hayan despertado su interés en Rx si nunca los ha usado, o le hayan dado algo en qué pensar cuando regrese a su propia base de código con Rx.

¿Interesado en aprender más? Verificar nuestros trabajos actuales aquí ¡y únete a nuestro equipo hoy!

Jessica Navarrete

Hola soy la Lic. nutricionista Jessica y eh creado este blog con la finalidad de ayudarte a mejorar tu vida, aqui encontraras consejos, recetas, recomendaciones, entre otras cosas, puede consultarme lo que gustes, estare al pendiente sigue tambien el blog por medio de facebook.

Puede que también te guste...

Deja un comentario

error: Content is protected !!