RxSwift — qué es, conceptos clave y programación reactiva

Autor: IT Sectr Publicado: 2026-03-17 Tiempo de lectura: 8 min

RxSwift es una biblioteca de programación reactiva para Swift que implementa el patrón Observable. Según ReactiveX, 2025, es la implementación más popular de Reactive Extensions para el ecosistema Apple. Observable actúa como fuente de eventos, mientras que Observer se suscribe para recibirlos.

Puntos clave

  • RxSwift — una implementación de Reactive Extensions para Swift con soporte para Observable, Subject y más de 300 operadores
  • Observable — una fuente de eventos que emite valores, errores o una señal de finalización
  • Subject — es a la vez Observable y Observer, permite insertar eventos manualmente en el flujo
  • DisposeBag — un mecanismo automático de gestión de memoria que cancela suscripciones al desasignarse
  • Schedulers — gestionan los hilos de ejecución, permitiendo cambiar entre colas principal y secundaria

¿Qué es RxSwift?

RxSwift es una biblioteca de programación reactiva para el lenguaje Swift, portada desde Reactive Extensions (Rx). Permite describir programas asíncronos y orientados a eventos mediante Observable Sequence — una secuencia de datos disponible en el tiempo. Los desarrolladores de iOS usan RxSwift para manejar solicitudes de red, eventos de UI y datos en flujo sin callbacks anidados.

Observable y Observer

La base de RxSwift consiste en dos protocolos clave: ObservableType — una fuente de eventos que puede emitir tres tipos de señales: .next(value), .error(error) y .completed. Observer se suscribe a Observable mediante el método subscribe y recibe estos eventos. Este modelo se llama Reactive Streams y garantiza que ningún evento se pierda con una suscripción correcta.

Operadores de transformación

RxSwift proporciona más de 300 operadores para trabajar con flujos: map transforma cada evento, filter solo deja pasar los que coinciden, flatMap despliega Observables anidados en un único flujo. Los operadores se encadenan, creando un pipeline declarativo de procesamiento de datos sin efectos secundarios.

Traits: Single, Completable, Maybe

Además del Observable básico, RxSwift proporciona tipos envoltorio especializados. Single emite exactamente un valor o un error — ideal para solicitudes HTTP. Completable finaliza con éxito o error sin valor — para operaciones de escritura. Maybe combina ambos escenarios: puede finalizar con valor, sin valor o con error. Estos Traits simplifican la semántica y hacen que el código se autodocumente.

Cómo funciona la programación reactiva en RxSwift

La programación reactiva en RxSwift se basa en el patrón Observer. ObservableSequence es análogo a Sequence de la biblioteca estándar, pero con acceso asíncrono a los elementos. El flujo de eventos se pasa a través de una cadena de operadores, cada uno devuelve una nueva ObservableSequence sin mutar la original.

Cadenas de operadores

Los operadores en RxSwift son funciones puras que toman una ObservableSequence y devuelven una nueva. Por ejemplo, map crea una nueva secuencia aplicando una transformación a cada elemento. Combinando operadores, el desarrollador construye un pipeline donde los datos pasan por todas las etapas de procesamiento sin variables intermedias.

Schedulers y hilos de ejecución

Schedulers son una abstracción sobre los hilos de ejecución en RxSwift. Un Scheduler determina en qué hilo se ejecutará el código: MainScheduler — el hilo de UI, SerialDispatchQueueScheduler — una cola en segundo plano. Los operadores subscribeOn y observeOn especifican dónde se realiza el trabajo y dónde se procesan los resultados, respectivamente.

Componentes principales de RxSwift

RxSwift incluye varios tipos básicos, cada uno resuelve su propia tarea en el pipeline reactivo. Single es un Observable que emite exactamente un valor o un error, conveniente para solicitudes de red. Completable finaliza con éxito o error sin valor. Maybe combina las propiedades de Single y Completable.

Subject y Relay

Subject es un Observable caliente que también actúa como Observer. PublishSubject emite solo eventos nuevos a los suscriptores, BehaviorSubject — el último evento más los nuevos. Relay es una variante de Subject que no emite .error ni .completed, garantizando la continuidad del flujo. BehaviorRelay almacena el valor actual y es adecuado para UI basada en estado.

DisposeBag

DisposeBag es una colección de Disposables que cancela automáticamente todas las suscripciones al desasignarse. En iOS, DisposeBag se agrega típicamente a UIViewController o UIView. Cuando se cierra la pantalla, DisposeBag se limpia — esto evita fugas de memoria y el acceso a elementos de UI inexistentes.

Ejemplos de código RxSwift

A continuación se muestra un ejemplo de creación de un Observable a partir de un array de datos usando el operador map para transformar cadenas:

swift
let observable = Observable.of("Swift", "RxSwift", "Reactive")

observable
    .map { $0.uppercased() }
    .subscribe(onNext: { value in
        print("Received: \(value)")
    })
    .disposed(by: disposeBag)

El segundo ejemplo demuestra la combinación de dos solicitudes de red usando zip — el operador espera a que ambos Observables emitan un valor y combina los resultados en una tupla:

swift
let first = fetchUser(id: "123")
let second = fetchPosts(userId: "123")

Observable
    .zip(first, second)
    .observe(on: MainScheduler.instance)
    .subscribe(onNext: { user, posts in
        updateUI(user: user, posts: posts)
    })
    .disposed(by: disposeBag)

El tercer ejemplo muestra el uso de BehaviorRelay para almacenar estado y actualizar automáticamente la UI ante cambios: cada cambio state.accept() se transmite inmediatamente a los suscriptores, lo que es ideal para patrones de Estado en arquitectura MVVM.

swift
let state = BehaviorRelay(value: "idle")

state
    .subscribe(onNext: { status in
        print("Status: \(status)")
    })
    .disposed(by: disposeBag)

state.accept("loading") // Prints: Status: loading

RxSwift vs otros enfoques

RxSwift se diferencia de los métodos asíncronos tradicionales (Delegation, NotificationCenter, Callback) por su naturaleza declarativa y componibilidad. A diferencia de Combine, RxSwift soporta iOS 9+ y tiene más operadores. Sin embargo, Combine está integrado en Foundation y SwiftUI a nivel de lenguaje, lo que le da ventaja en nuevos proyectos de Apple.

La principal ventaja de RxSwift sobre GCD (Grand Central Dispatch) es la capacidad de combinar y transformar flujos de datos a nivel de abstracción, en lugar de gestionar colas manualmente. Sin embargo, RxSwift requiere aprender conceptos reactivos, lo que aumenta la barrera de entrada para el equipo.

En la práctica, RxSwift se usa en proyectos grandes donde las cadenas reactivas conectan eventos de UI, lógica de negocio e interacción de red en un único pipeline. Por ejemplo, en aplicaciones de trading, los flujos de cotizaciones se procesan mediante RxSwift: los ticks llegan desde WebSocket, pasan por filtrado, se agrupan por timeframe y se muestran en un gráfico en tiempo real. Este escenario es difícil de implementar mediante Delegation o NotificationCenter sin perder legibilidad.

Las alternativas a RxSwift incluyen Combine (iOS 13+), AsyncSequence de Swift Concurrency (iOS 15+), así como bibliotecas de terceros como ReactiveSwift sin dependencia de plataformas Apple. La elección depende de la versión mínima soportada de iOS y la experiencia de los desarrolladores. Para nuevos proyectos iOS 15+, los equipos suelen elegir AsyncSequence — no requiere instalación de bibliotecas y usa construcciones nativas del lenguaje Swift.

Los patrones arquitectónicos con RxSwift generalmente siguen MVVM o Clean Architecture. ViewModel contiene toda la lógica de negocio como cadenas Observable, View se suscribe a los datos transformados. El patrón Input-Output separa eventos de entrada (toques, entrada de texto) de estados de salida (texto del botón, visibilidad del loader). Este enfoque simplifica las pruebas: ViewModel se prueba sin UI a través de Schedulers virtuales.

RxSwift es adecuado tanto para proyectos pequeños con pocas pantallas como para grandes aplicaciones empresariales con docenas de módulos. En proyectos grandes, las cadenas reactivas impregnan toda la arquitectura: desde la observación de UserDefaults mediante RxProperty hasta solicitudes de red a través de Moya (un envoltorio RxSwift sobre Alamofire). Cada módulo está aislado y se comunica a través de interfaces reactivas, lo que simplifica el reemplazo de implementación sin cambiar suscriptores. Con una arquitectura adecuada, RxSwift reduce la cantidad de código en comparación con enfoques clásicos, ya que no es necesario escribir código repetitivo para KVO, Target-Action o NotificationCenter.

RxSwift se utiliza activamente en proyectos con RxDataSources — una biblioteca para trabajo reactivo con UITableView y UICollectionView. RxDataSources calcula automáticamente la diferencia entre conjuntos antiguos y nuevos de celdas y aplica cambios animados. Esto libera al desarrollador del trabajo manual con beginUpdates/endUpdates y elimina crashes por inconsistencia de datos.

Para depurar cadenas RxSwift, existe el operador debug() — registra todos los eventos: subscribe, next, error, completed, dispose. Es una herramienta indispensable al desarrollar pipelines reactivos complejos. debug(String) toma un identificador que aparece en los registros. Para perfilado de memoria, RxSwift.Resources.total muestra el número total de Observables y Disposables activos en la aplicación — ayuda a identificar fugas cuando DisposeBag no se limpia o un retain cycle mantiene una suscripción. El operador adicional takeUntil(self.rx.deallocated) cancela automáticamente la suscripción al desasignarse el objeto — esta es otra capa de protección contra fugas.

Mejores prácticas de RxSwift

Al escribir código RxSwift, es importante seguir el principio de único Observable por suscripción: cada ViewController no debe crear más de una Suscripción al mismo Observable — esto reduce el riesgo de condiciones de carrera. Para memoización de Observables se usa el operador share(), que convierte un Observable frío en caliente con un búfer replay de tamaño 1. Al trabajar con recursos compartidos, use connect() para controlar el inicio de la emisión — esto garantiza que todos los suscriptores se conecten antes del primer evento.

Las pruebas de código RxSwift se realizan mediante TestScheduler — un Scheduler virtual que permite gestionar el tiempo. testScheduler.createHotObservable(values) crea un Observable con una secuencia predefinida de eventos por tiempo virtual. testScheduler.start() inicia el procesamiento. TestScheduler permite comprobar en qué orden y en qué timestamp virtual ocurren los eventos, sin retrasos reales, haciendo las pruebas rápidas y deterministas.

Preguntas frecuentes

¿Cuál es la diferencia entre Observable y Subject en RxSwift?

Observable es una fuente fría: no emite eventos hasta la suscripción. Subject es caliente: emite eventos independientemente de los suscriptores y permite la inserción manual de valores mediante onNext. PublishSubject transmite solo eventos nuevos, BehaviorSubject — el último más los nuevos.

¿Cómo previene DisposeBag las fugas de memoria en RxSwift?

DisposeBag almacena todas las suscripciones Disposable. Cuando DisposeBag se desasigna (por ejemplo, al cerrar un ViewController), todas las suscripciones almacenadas se cancelan automáticamente. Esto garantiza que Observable no enviará un evento a un objeto de UI destruido.

¿Qué elegir: RxSwift o Combine para un nuevo proyecto iOS?

Si la versión mínima de iOS es 13+ y el equipo conoce SwiftUI — elija Combine. Si el proyecto soporta iOS 12 o inferior o requiere un conjunto mayor de operadores — RxSwift. Combine ofrece mejor integración con Foundation (URLSession, Timer, NotificationCenter).

¿Cómo funcionan los Schedulers en RxSwift?

Schedulers abstraen los hilos de ejecución. subscribeOn especifica en qué Scheduler se realiza la suscripción (generalmente en segundo plano). observeOn determina en qué Scheduler se reciben los eventos (normalmente MainScheduler para actualizaciones de UI). SerialDispatchQueueScheduler funciona a través de GCD.

¿Se puede usar RxSwift con SwiftUI?

Sí, RxSwift se puede integrar con SwiftUI mediante ObservableObject. Use BehaviorRelay como propiedades @Published: la suscripción a Relay transmite cambios a Combine, y SwiftUI redibuja la View mediante @ObservedObject. Este es un patrón popular de migración de UIKit a SwiftUI.

Resumen

  • RxSwift — una biblioteca de programación reactiva basada en Reactive Extensions y el patrón Observable
  • Observable emite tres tipos de señales: .next, .error y .completed
  • Subject (PublishSubject, BehaviorSubject) combina Observable y Observer para flujos calientes
  • DisposeBag gestiona el ciclo de vida de las suscripciones y previene fugas de memoria
  • Operadores (map, filter, flatMap, zip) permiten construir cadenas de procesamiento declarativas
  • Schedulers cambian la ejecución entre colas secundarias y el hilo de UI
  • Para nuevo desarrollo en iOS 13+, considere Combine como alternativa integrada

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también