Publishers y Subscribers personalizados
Cree sus propios componentes de Combine.
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.
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
- Transformar y combinar flujos
- Planificadores y subprocesos
- Operadores de gestión de errores
- Publishers y Subscribers personalizados