• slidebg1

RxSwift: Programación reactiva en Swift


Los sistemas desarrollados como Sistemas Reactivos son más flexibles, están poco acoplados y son escalables. Son más tolerantes a fallos y cuando un fallo ocurre son capaces de recuperarse más rápido.

¿Qué es la programación reactiva?

La programación reactiva está orientada a la reacción, al flujo de datos y al principio de causalidad, es decir, cada causa esta asociada a sus efectos. Según el manifiesto de la programación reactiva, los sistema reactivos tienen 4 características: 

  • Responsividad: El sistema responde de forma rápida y en tiempos consistentes.  Este comportamiento consistente simplifica la gestión de error de errores e incita a la interacción entre componentes.
  • Resiliencia: Lo sistemas serán responsivos incluso cuando se produzcan fallos, para ello los fallos deben ser aislados y contenidos en componentes para facilitar la recuperación del estado estable sin comprometer la integridad del propio sistema.
  • Elasticidad: Se asignan y liberan recursos de forma dinámica y se adaptan a variaciones en la carga de trabajo de forma que no existen cuellos de botella.
  • Orientados a mensajes: La comunicación bloqueante no existe. Se confía plenamente en el intercambio de mensajes asíncronos.

 

 

ReactiveX

ReactiveX es una librería para desarrollar programas asíncronos y basados en eventos usando secuencias observables.

Implementa el diseño reactivo basándose en extender el patrón observer (patrón observador) para dar soporte a flujos de datos y/o eventos y añadir operaciones que permiten componer secuencias declarativamente mientras se abstraen conceptos a bajo nivel como threading, sincronización de hilos, estructuras de datos concurrentes y flujos E/S de datos no bloqueantes.

¿Por qué usa observables?

El modelo ReactiveX Observable permite tratar flujos de datos (streams) de eventos asíncronos con el mismo conjunto de operaciones simples y componibles que son usados para tratar colecciones de datos como los arrays.

Lenguajes soportados

ReactiveX se ha portado a distintos lenguajes como Java, Javascript, .Net, Scala, Swift… de forma que se puede utilizar de forma rápida en cualquier desarrollo software actual.

Programación reactiva en Swift

La implementación en Swift de la librería ReactiveX (Rx) se denomina RxSwift e intenta portar los máximos conceptos de la versión original pero algunos de ellos han sido adaptados para mejorar la integración con el entorno iOS/macOS. Al igual que Rx, intenta facilitar la composición de operaciones asíncronas y flujos de eventos y/o datos.

Definiciones básicas de RxSwift

La equivalencia entre el patrón observador (Observable secuencia) y las secuencias normales (Sequence) es el concepto más importante que hay que entender en RX. 

Toda secuencia Observable es una secuencia. La ventaja de un Observable sobre una Secuencia de Swift es que, además de todo lo aportado por una Secuencia, puede recibir elementos de forma asíncrona. Este es el núcleo de RxSwift.

  • Observable (ObservableType) es equivalente a Sequence.
  • El método ObservableType.suscribe es equivalente a Sequence.makeIterator
  • El callback de un observador necesita se enviado al método ObservableType.suscribe para recibir secuencias de elementos en lugar de llamar al método next() en el iterador devuelto.

Las secuencas en RX se describen por una interfaz push (callback)

Cuando una secuencia envía el evento completed o error todos los recursos internos que computan la secuencia de elementos se liberan.

Ejemplo de RxSwift

Vamos a realizar un ejemplo simple en el que se implementará un viewcontroller con capacidad de buscar sobre un conjunto de datos y mostrará en una tabla los resultados de dicha búsqueda.

En primer lugar vamos a definir un fichero Podfile de CocoaPods y generamos el proyecto con las librerías Rx.

 

 

Vamos a declarar un array con nombres de colores y realizaremos las búsquedas sobre él:

Definimos un ViewController con un TableView y una SearchBar

El código resultante sería el siguiente:

 

Lo más interesante es la cadena de llamadas que componen la señal que lanzará la suscripción que se producen en la cadena text del elemento searchBar. La librería RxSwift añade extensiones para prácticamente cualquier elemento UIView (a partir de la versión 3.0 las extensiones empiezan por rx) y ofrece soporte para Swift 3.0 y 3.1.

En primer lugar se utiliza la extensión que se ha definido dentro de RxSwift sobre los objetos de la clase UISearchBar (text). Esta propiedad emite señales cada vez que dicho texto es modificado. Sobre esta señal se encadena la propiedad orEmpty que fuerza que la variable text  sea un no opcional.

En este momento se encadena la función debounce que recibe un delay sobre cuando lanzar las señales y un Scheduler que indica sobre qué hilo se debe ejecutar dicha señal (en este caso el hilo principal). Aplicar esta función provoca que se lancen eventos cada 0.5 segundos, esto conlleva a tener una sobrecarga de emisiones cuando no es siempre necesario (por ejemplo cuando el campo texto no se modifica), para ello se encadena la función distinctUntilChanged() que provocará que sólo se realicen emisiones cuando el texto se modifique.

En este punto ya tenemos configurada la señal y podemos suscribirnos, para ello utilizamos la función subscribe. En este caso dicha función recibe una cadena con el texto modificado (de tipo Event) que utilizaremos para realizar un filtro sobre los colores. El resultado de este filtro contendrá todos los valores que empiecen por dicha cadena y para actualizar la vista recargaremos el TableView.

Para liberar correctamente todos los recursos usados y eliminar referencias a objetos antiguos una vez se ha ejecutado la suscripción se debe utilizar una DisposableBag. La forma para añadir una DisposableBag a nuestra cadena de llamadas es llamar a la función de liberación de recursos (addDisposableTo) con una instancia de dicha clase.

Conclusión

En esta breve introducción  a la programación reactiva hemos aprendido que es muy potente y nos ayuda a simplificar mucha lógica evitando realizar operaciones a bajo nivel pero conlleva tener muy claros tanto los conceptos como la metodología a usar. En próximos artículos intentaremos ahondar más sobre aspectos avanzados de una tecnología muy presente en la actualidad.

Públicado el 03/04/2017

Comparte este post:

CATEGORÍAS: Aprendizaje Desarrollo