La programación reactiva es un paradigma de programación asincrónica que se ocupa de los flujos de datos y la propagación del cambio.
RxSwift es una biblioteca para trabajar con código asíncrono que presenta eventos como flujos de eventos con la capacidad de suscribirse a ellos y le permite aplicarles enfoques de programación funcional, lo que simplifica enormemente el trabajo con secuencias complejas de eventos asíncronos.
¿Por qué debería usar RxSwift?
RxSwift organiza el trabajo con flujos de eventos y conexiones entre objetos.
El ejemplo más simple y obvio son los enlaces: puede actualizar la interfaz simplemente configurando un nuevo valor para una variable en el ViewModel
. Por lo tanto, la interfaz se vuelve impulsada por datos.
Además, RxSwift le permite describir el sistema en un estilo declarativo, lo que simplifica el código y mejora su legibilidad. RxSwift también recibe constantemente nuevas actualizaciones, corrige errores menores, agrega funciones de nuevas versiones de Swift y nuevos enlaces.
Y RxSwift es de código abierto, puede realizar un seguimiento de todos los cambios.
Conceptos básicos de RxSwift
Hay tres tipos principales de componentes de código Rx:
- observables,
- Operadores, y
- programadores.
observables
Un Observable es una secuencia con algunas características especiales. Una de estas características, y quizás la más esencial, es asincrónica.
Los observables generan eventos a lo largo del tiempo, lo que se conoce como emisión. Los eventos pueden incluir valores como números o instancias de un tipo personalizado, o pueden ser gestos reconocidos como toques.
Operadores
La clase Observable contiene varios métodos auxiliares que pueden realizar varias operaciones en los elementos de la secuencia.
Dado que no tienen efectos secundarios, se pueden combinar, lo que le permite construir una lógica bastante compleja en un estilo declarativo.
programador
El planificador nos permite ejecutar nuestros observables en subprocesos específicos. Hay dos formas de configurar el programador observable: observeOn()
y subscribeOn()
.
SubscribeOn()
es responsable de en qué subproceso se ejecutará todo el proceso observable hasta que sus eventos lleguen al suscriptor. Como puedes suponer, ObserveOn()
se ocupa de un hilo que procesa los eventos recibidos de subscriberOn()
.
Con el programador, puede descargar fácilmente cualquier cosa de la web en un subproceso en segundo plano y, una vez que obtiene el resultado, puede ir al subproceso principal y afectar la interfaz de usuario.
Un ejemplo de RxSwift:
Ahora que hemos descubierto los conceptos básicos de la biblioteca y entendido por qué debemos usarla, veamos un ejemplo práctico.
import RxCocoa import UIKit import RxSwift class ViewController: UIViewController { @IBOutlet weak var countLabel: UILabel; @IBOutlet weak var tapButton: UIButton; var count = 0 var disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() countLabel.text = "(count)" tapButton.rx .tap .throttle(5.0, scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in self?.count += 1 self?.countLabel.text = "(self?.count ?? 0)" }) .disposed(by: disposeBag) } }
Para simplificar este ejemplo, hagamos que el número en el contador aumente cuando se presiona el botón.
Para esto, primero, necesitas importar las dependencias:
import RxCocoa import RxSwift
Ahora echemos un vistazo a la pieza de código en tapButton.rxcentrándose en cada línea.
tapButton.rx .tap .throttle(5.0, scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in self?.count += 1 self?.countLabel.text = "(self?.count ?? 0)" }) .disposed(by: disposeBag) } }
Como mencioné anteriormente, RxCocoa nos brinda la familia de métodos Rx que contienen métodos listos para usar que devuelven un ControlEvent
para nosotros.
En este caso, estamos interesados en el método tap. Nos suscribimos para recibir eventos, donde pasamos un cierre a la onNext
parámetro, que se ejecutará cuando ocurra cada evento.
También estamos incrementando el contador y actualizando la etiqueta. Desde ControlEvent
es esencialmente una secuencia infinita, no tendrá onError
y onComplete
parámetros
También debemos mencionar DisposeBag
por separado. Cuando termina de trabajar con una secuencia, necesita liberar memoria. Cuando miramos la fuente de ObservableType
deberíamos ver que el método subscribe devuelve un objeto de tipo Disposable
.
Y si observa su protocolo, resulta que requiere un único método de eliminación que, como puede adivinar por su nombre, cumple este propósito. Pero la eliminación manual de objetos puede resultar tediosa, por lo que debe utilizar el DisposeBag
clase y por qué?
Si está utilizando una suscripción y no la agrega a la bolsa, la elimina explícitamente o completa el observable de alguna otra manera, es probable que tenga una pérdida de memoria.
Por lo tanto, para evitar esto, DisposeBag
debería ser usado.
Conclusión
RxSwift es una biblioteca relativamente grande. Si desea familiarizarse con todas las API, debe leer la documentación, codificar con frecuencia y leer el código fuente.
Un estudio detallado de la documentación de RxSwift no solo aumentará su eficiencia de desarrollo, sino que también profundizará su comprensión del lenguaje Swift. Por lo tanto, puedo desearle todo lo mejor en su exploración de RxSwift.