Skip to content
GitHub Twitter

¿Es hora de dejar Combine o RxSwift en favor de AsyncStream?

Recientemente me encontré con un artículo de LinkedIn que hizo que me replanteara algo que muchos desarrolladores de Swift han estado considerando últimamente: ¿es hora de dejar atrás frameworks como Combine o RxSwift en favor de AsyncStream?. El post de Aleksa Simic cuestionaba la relevancia de estos frameworks frente al nuevo paradigma de concurrencia que Swift nos ha traído. Esto me dejó con muchas dudas y, como soy de los que prefieren investigar y probar antes de tomar una decisión, me lancé a profundizar en el tema.

¿De qué va todo esto?

Si has estado desarrollando en Swift durante los últimos años, es probable que hayas utilizado RxSwift o Combine para manejar flujos de datos, eventos y concurrencia en tus aplicaciones. Estas herramientas han sido fundamentales para muchos desarrolladores, especialmente en proyectos que requerían procesamiento de datos en tiempo real o manejar varios flujos de eventos simultáneamente.

Pero, con la llegada de Swift 5.5 y su introducción de async/await, además de herramientas como AsyncStream, las aguas han comenzado a agitarse. La comunidad se pregunta si realmente necesitamos frameworks como Combine o RxSwift, cuando ahora tenemos soluciones nativas para manejar tareas asíncronas de manera más sencilla.

Así que, ¿realmente vale la pena dejar atrás estos frameworks probados? Vamos a explorar.

AsyncStream es una herramienta que forma parte del nuevo ecosistema de concurrencia en Swift. A través de async/await, Swift simplifica la manera en que gestionamos el código asíncrono, permitiéndonos escribir flujos de eventos secuenciales sin necesidad de manejar manualmente colas o hilos. Pero más allá de la simplicidad, el gran beneficio de AsyncStream es que es parte del propio lenguaje, lo que significa menos dependencias externas y mejor integración nativa.

// Ejemplo básico de AsyncStream
func streamNumbers() -> AsyncStream<Int> {
    return AsyncStream { continuation in
        for i in 1...10 {
            continuation.yield(i)
        }
        continuation.finish()
    }
}

Task {
    for await number in streamNumbers() {
        print(number)
    }
}

Ventajas de AsyncStream:

  1. Simplicidad: Si ya estás usando async/await, integrar AsyncStream es mucho más directo que aprender un framework externo como Combine.
  2. Ligero: Al ser nativo de Swift, no necesitas añadir nuevas dependencias a tu proyecto, lo que hace que sea más eficiente y fácil de mantener.
  3. Compatibilidad con Swift Concurrency: Si tu proyecto ya usa async/await, AsyncStream se integra perfectamente en ese flujo.

¿Y qué pasa con Combine y RxSwift?

Tanto Combine como RxSwift han sido fundamentales para la comunidad de Swift, cada uno trayendo sus propias ventajas y casos de uso. Combine es el framework oficial de Apple para manejar flujos de datos reactivos y se integra muy bien con SwiftUI. RxSwift, por otro lado, sigue siendo una de las librerías más potentes para la programación reactiva en Swift, especialmente en aplicaciones complejas que requieren combinar y transformar múltiples flujos de eventos.

// Ejemplo básico de Combine
import Combine

let publisher = [1, 2, 3, 4, 5].publisher

let cancellable = publisher
    .sink { value in
        print(value)
    }

Pero a pesar de todo, con la aparición de async/await y AsyncStream, muchas de las ventajas que hacían a Combine o RxSwift esenciales ahora están disponibles nativamente en Swift, lo que ha llevado a algunos desarrolladores a preguntarse si seguir con estos frameworks vale la pena.

Ventajas de Combine y RxSwift:

  1. Potencia y flexibilidad: Para manejar flujos de datos complejos y reactivos, Combine y RxSwift siguen siendo los líderes.
  2. Operadores avanzados: Estos frameworks proporcionan una gran variedad de operadores para transformar, combinar y filtrar datos, algo que aún no se encuentra en la implementación actual de AsyncStream.
  3. Interoperabilidad: En proyectos grandes, donde Combine o RxSwift ya están implementados, migrar completamente a async/await puede ser costoso en términos de tiempo y esfuerzo.

¿Entonces, debería hacer el cambio?

Mi respuesta es: depende.

¿Cuándo elegir AsyncStream?

  • Si estás construyendo un proyecto nuevo y ya estás usando async/await en otras áreas del código, AsyncStream es una excelente opción para mantener la simplicidad y coherencia del código.
  • Si no necesitas manejar flujos de datos complejos y simplemente necesitas procesar eventos de manera secuencial, AsyncStream es ideal por su simplicidad.

¿Cuándo seguir con Combine o RxSwift?

  • Si tu proyecto tiene flujos de datos complejos, con múltiples eventos que necesitan combinarse o transformarse, Combine o RxSwift son aún superiores debido a su gran cantidad de operadores y potencia.
  • Si ya tienes un proyecto establecido que usa Combine o RxSwift, cambiar a AsyncStream podría no ser la mejor idea a menos que veas una mejora significativa en el mantenimiento o rendimiento.

¿Es hora de dejar Combine y RxSwift?

La aparición de AsyncStream nos ofrece una alternativa simple y nativa para manejar flujos de datos en Swift. Sin embargo, frameworks como Combine y RxSwift siguen siendo herramientas poderosas para escenarios más complejos. Para proyectos nuevos y simples, tiene sentido apostar por las herramientas nativas como AsyncStream, pero si tu aplicación requiere un manejo avanzado de datos, Combine o RxSwift siguen siendo opciones fuertes.

¿Dejar Combine o RxSwift? No necesariamente. Ambos siguen siendo extremadamente valiosos, pero con AsyncStream, tenemos ahora una opción más ligera y simple, lo cual no es malo en absoluto.

Referencias:

  1. Aleksa Simic on LinkedIn: Is anyone still using RxSwift or Combine?

  2. Apple Developer Documentation: Swift AsyncStream

  3. Ray Wenderlich: Combine Framework Tutorial

  4. RxSwift GitHub Repository