¿Estás pensando en utilizar RxSwift pero no estás muy seguro de por qué deberías hacerlo?
Tienes que saber que los Sistemas Reactivos tienen varias ventajas, comenzando por el hecho de que son más flexibles, además de que son escalables y están menos acoplados. Además, toleran mejor los fallos y se pueden reponer en menos tiempo cuando se presenta un problema.

Antes de empezar a hablar sobre RxSwift quiero explicar de forma breve y clara qué es la programación reactiva, ya que es necesario que lo entiendas para que puedas tener una visión completa.

En pocas palabras, podemos decir que la programación reactiva es aquella que está enfocada en la reacción. Dentro de los sistemas reactivos podemos encontrarnos 4 características principales:

  • Resiliencia: los sistemas pueden afrontar mucho mejor los fallos que se generen, gracias a que consiguen aislar el contenido y los fallos en componentes. Por tanto, tienen la capacidad de sobreponerse adecuadamente a cualquier fallo y superarlo de forma satisfactoria.
  • Responsividad: estos sistemas siempre tienen que responder de forma constante y rápida. Su comportamiento hace que sea más sencillo gestionar cualquier error y mejorar la interacción entre sus componentes.
  • Orientación a mensajes: en estos sistemas no hay comunicación bloqueante. Se confía en el intercambio de los mensajes asíncronos.
  • Elasticidad: la asignación y liberación de los recursos se hace de forma dinámica, pudiendo ajustarse mejor a las variaciones de la carga de trabajo, evitando que se presente un cuello de botella.

¿Qué es ReactiveX? 

Es completamente necesario saber qué es ReactiveX antes de empezar a hablar sobre RxSwift. Se trata de una librería que sirve para desarrollar programas asíncronos que están basados en eventos.

En ReactiveX se utiliza un diseño reactivo que se enfoca en extender el patrón observer con el fin de poder darle soporte a los flujos de datos o a los eventos y así poder agregar operaciones que permitan componer secuencias mientras se abstraen conceptos como la sincronización de hilos, threading, flujos E/S de datos no bloqueantes y estructuras de datos concurrentes.

¿Por qué usa patrones observer?

Cuando se utiliza el modelo ReactiveX Obsever se produce una relación de interdependencia entre diferentes objetos. En los patrones Observer siempre existe un objeto raíz del que dependen los demás y a los que constantemente les informa sobre cualquier modificación que se lleva a cabo en el estado. Por tanto, la gran ventaja del uso de estos patrones es que se evita que los distintos objetos tengan que estar comprobando constantemente si se han producido actualizaciones o cambios.

¿Qué lenguajes son soportados por ReactiveX? 

Entre los lenguajes que son soportados por ReactiveX podemos destacar Swift, Java, Javascript, Scala y .Net, pudiendo ser una excelente opción para desarrollar cualquier hardware de forma rápida y sencilla.

¿Qué es RxSwift? 

Cuando hablamos de RxSwift nos estamos refiriendo a la implementación del lenguaje Swift en la librería ReactiveX, la cual tiene el objetivo de aportar los conceptos de la versión original, aunque algunos hayan sido adoptados para poder mejorar la integración con el entorno MacOS e iOS.

De la misma forma que Rx, también tiene el objetivo de hacer que la composición de operaciones asíncronas y flujos de datos o evento sea más sencilla.

Las definiciones básicas de RxSwift 

Uno de los conceptos más importantes que se tienen que comprender sobre Rx es la equivalencia del patrón Observer y las secuencias normales.

De esta forma, podemos decir que una de las ventajas principales de un Observable con respecto a una Secuencia Swift es, además de todo aquello que aporta la Secuencia, la posibilidad de recibir los elementos de una forma asíncrona.

También se debe de tener en cuenta que las secuencias RX son descritas por una interfaz push o callback. En el momento en el que la secuencia envía un evento completo o un error, todos los recursos internos que se encargan de computar la secuencia son liberados.

¿Por qué utilizar RxSwift? 

Ahora comenzaremos a darte razones por las que deberías de utilizar RxSwift, hablando un poco sobre las ventajas que podrás obtener al usarlo:

La asincronía 

Un detalle importante que se debe de tener en cuenta sobre los flujos de trabajo asíncronos es que estos pueden ser bastante fáciles de entender pero que en el momento de codificar no es algo tan sencillo.

Podemos tomar como ejemplo un inicio de sesión de una aplicación, trabajo que necesita de varios pasos: validación de entrada, verificación de la respuesta de API, la carga de los archivos, entre otros. En este caso, lo cierto es que el flujo de trabajo no es complicado a nivel abstracto, pero hacer el código y comprenderlo no será una tarea tan sencilla.

El código puede llegar a ser difícil de seguir debido a que al usar el estilo imperativo de OOP, éste se extiende a través de distintas capas. Además, las notificaciones, devolución de llamadas, delegados, etc, pueden complicar aún más todo.

En el caso de Rx los cambios son tratados como eventos asíncronos en una secuencia. De esta forma, se empujan los eventos (push based) y puedes olvidarte de ellos. Así se termina creando un canal de comunicación que es observable por los suscriptores. Un suscriptor se encarga de especificar qué es lo que sucede cuando un evento se lleva a cabo de una forma declarativa.

Por medio del código declarativo se puede describir un flujo de trabajo asíncrono más complejo en unas pocas líneas.

Se consigue simplificar el multi-treading  

Como seguramente ya deberías saber hay momentos en los que es necesario hacer cosas en distintos subprocesos para poder darle al usuario la mejor experiencia posible.

Por ejemplo, para poder cargar cosas en un segundo plano y poder mostrarlas de forma progresiva sobre el hilo principal.

Al usar RxSwift se tiene la posibilidad de reaccionar a los cambios de distintos hilos, algo que se puede logar con menos código, menos errores y de una forma menos compleja. Se puede ver un evento en el hilo principal y se puede reaccionar a él en un segundo plano. Esto termina por mejorar bastante la experiencia, ya que se puede volver al hilo principal para dar los resultados.

Un código más limpio con una mejor arquitectura 

Se debe de tener en cuenta que las transmisiones Rx son inmutables, lo que quiere decir que se pueden crear objetos y reaccionar a los cambios que están abiertos a extensiones y cerrados a las modificaciones.

Además, gracias a que los datos tienen la posibilidad de fluir de forma unidireccional, podemos decir que Rx es completamente compatible con la Arquitectura Limpia y también con la regla de dependencia. Las dependencias tienen que ir en una dirección y Rx es excelente para permitir construir distintos canales de comunicación entre las capas de la arquitectura.

La relación entre RxSwift y RxCocoa 

Tanto RxCocoa como RxSwift forman parte de la librería de ReactiveX, siendo herramientas de lenguaje que están divididas en distintas variantes de programación.

Anteriormente ya explicamos que RxSwift es la implementación del lenguaje Swift en Rx, mientras que RxCocoa es un marco que sirve para hacer que las API de Cocoa usadas en MacOS X y en iOS sean mucho más sencillas de utilizar con técnicas reactivas.

Con los marcos ReactivoX se puede conseguir un vocabulario común que sirve para aquellas tareas que se utilizan de forma repetida en distintos lenguajes de programación. Así, se logra que sea mucho más fácil poder enfocarse en la sintaxis del lenguaje en lugar de tener que descubrir cómo se tiene que asignar una tarea común a cada uno de los idiomas.

¿Qué son los observables y los observadores?

Es importante tener claro en qué consisten los conceptos “Observable” y “Observador”, por lo que no terminaremos el artículo sin explicar en qué consisten ambos:

  • Un Observable sirve para emitir notificaciones de cambio.
  • Un Observador (Observer) se debe de suscribir a un Observable y luego recibe notificaciones cuando el Observable cambie.

Un Observable puede tener varios Observadores escuchando. Cuando el Observable cambia, se notifica a todos los Observadores.

Conclusión 

Entonces, ¿por qué deberías utilizar RxSwift? El motivo principal por el que deberías de usarlo es para poder manejar los problemas asíncronos de una forma más efectiva, ya que este permite escribir un código que sea mejor y más limpio, pudiendo crear componentes que se puedan reutilizar dentro de una base de código más robusta que sea escalable.

Si te estás preguntando si es una buena opción para utilizarlo siempre, debes de saber que, al igual que cualquier otra herramienta, se tiene que utilizar cuando sea lo que se ajuste a tus necesidades. Es importante tomar en consideración el conocimiento que tiene el equipo, los plazos, el contexto y todo lo necesario para poder tomar una buena decisión.

Generalmente, suele ser una buena decisión a largo plazo, ya que la forma en la que se pueden diseñar y conectar las distintas capas usando RxSwift puede resultar bastante efectiva. Aunque está claro que tal vez no sea la mejor opción para todos, es cierto que muchos desarrolladores se han beneficiado de su uso.