Swift Academy · Lección

Publishers y Subscribers personalizados

Cree sus propios componentes de Combine.

Lección 4 de 413 pasos

Publishers y Subscribers personalizados es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Más allá de los publishers integrados

Combine incluye muchos publishers, pero a veces necesita convertir una API que no usa Combine en un publisher, o consumir valores con un control preciso de backpressure. Para ello, debe implementar los protocolos Publisher y Subscriber por su cuenta.

El protocolo Publisher

Un Publisher declara sus tipos Output y Failure, e implementa receive(subscriber:), donde entrega una subscription al subscriber entrante.

protocol Publisher {
    associatedtype Output
    associatedtype Failure: Error
    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Output, S.Failure == Failure
}

La función de Subscription

Cuando un subscriber se conecta, el publisher crea un objeto Subscription. La subscription es el vínculo que gestiona la demanda y entrega los valores. Se ajusta al protocolo Subscription, que amplía Cancellable.

Una Subscription personalizada

La subscription almacena el subscriber y responde a las solicitudes de demanda emitiendo valores.

final class CountSubscription<S: Subscriber>: Subscription
    where S.Input == Int {
    private var subscriber: S?
    private var current = 0

    init(subscriber: S) {
        self.subscriber = subscriber
    }

    func request(_ demand: Subscribers.Demand) {
        var remaining = demand
        while remaining > 0 {
            remaining -= 1
            remaining += subscriber?.receive(current) ?? .none
            current += 1
        }
    }

    func cancel() {
        subscriber = nil
    }
}

Un Publisher personalizado

El publisher simplemente crea la subscription y se la pasa al subscriber mediante receive(subscription:).

struct CountPublisher: Publisher {
    typealias Output = Int
    typealias Failure = Never

    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Int, S.Failure == Never {
        let subscription = CountSubscription(subscriber: subscriber)
        subscriber.receive(subscription: subscription)
    }
}

Comprender la demanda

Backpressure es el mecanismo de control de flujo de Combine. Un subscriber solicita una cantidad determinada de Demand, y el publisher no debe enviar más valores de los solicitados. Devolver demanda desde receive(_:) aumenta el límite permitido.

El protocolo Subscriber

Un Subscriber personalizado implementa tres métodos: recibe la subscription, después cada valor y, por último, una finalización.

protocol Subscriber {
    associatedtype Input
    associatedtype Failure: Error
    func receive(subscription: Subscription)
    func receive(_ input: Input) -> Subscribers.Demand
    func receive(completion: Subscribers.Completion<Failure>)
}

Un Subscriber personalizado

En este caso, un subscriber solicita inicialmente dos valores y después uno más por cada valor que recibe, mostrando cada uno a medida que llega.

final class PrintSubscriber: Subscriber {
    typealias Input = Int
    typealias Failure = Never

    func receive(subscription: Subscription) {
        subscription.request(.max(2))
    }

    func receive(_ input: Int) -> Subscribers.Demand {
        print("Value:", input)
        return .max(1)
    }

    func receive(completion: Subscribers.Completion<Never>) {
        print("Done")
    }
}

Envolver una API basada en delegates

Un uso práctico de los publishers personalizados es conectar una API basada en delegates o callbacks con Combine, de modo que el código heredado se vuelva componible. Debe almacenar el subscriber y reenviar las llamadas del delegate como llamadas a receive(_:).

Prefiera los subjects cuando sea posible

Rara vez es necesario implementar estos protocolos manualmente. Para la mayoría de las integraciones, un PassthroughSubject o un CurrentValueSubject es mucho más sencillo: solo tiene que llamar a send(_:).

let subject = PassthroughSubject<Int, Never>()

subject
    .sink { print($0) }
    .store(in: &cancellables)

subject.send(1)
subject.send(2)

Cuándo crear implementaciones personalizadas

Recurra a implementaciones personalizadas de Publisher/Subscriber cuando necesite:

  • Un control detallado de backpressure
  • Envolver de forma eficiente una fuente compleja que no use Combine
  • Operadores reutilizables y con seguridad de tipos

En los demás casos, los subjects y los operadores integrados son la herramienta adecuada.

Comprobación rápida

Compruebe sus conocimientos sobre publishers personalizados.

Resumen

Ha aprendido a implementar los protocolos principales de Combine:

  • Publisher crea una Subscription para cada subscriber
  • La subscription respeta Demand (backpressure)
  • Subscriber recibe la subscription, los valores y la finalización
  • Prefiera los subjects para la mayoría de las integraciones

Comprender estos detalles internos aclara cómo funciona Combine en su totalidad.

Gratis para empezar

Aprende Swift con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
122
Lecciones
409

Preguntas frecuentes

¿La lección «Publishers y Subscribers personalizados» es gratis?

Sí — el texto completo de «Publishers y Subscribers personalizados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Publishers y Subscribers personalizados»?

Cree sus propios componentes de Combine. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Publishers y Subscribers personalizados»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Transformar y combinar flujos
  2. Planificadores y subprocesos
  3. Operadores de gestión de errores
  4. Publishers y Subscribers personalizados
← Volver a Swift Academy