0Pricing
Swift Academy · Lección

Alternativas al patrón Observer

Compare este patrón con delegates y publishers de Combine.

Alternativas al patrón Observer 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.

Alternativas al patrón Observer

NotificationCenter es una forma de reaccionar a eventos. Swift ofrece otras: delegación, Combine y secuencias asíncronas. Cada una se adapta a una forma distinta de comunicación.

El patrón Observer

El patrón observer permite que los objetos se suscriban a eventos de un sujeto. NotificationCenter es una implementación global y débilmente acoplada de este patrón.

import Foundation

// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")

Delegación

Un delegado establece un vínculo de uno a uno: un objeto reenvía eventos específicos a un único delegado mediante un protocolo. Es una solución explícita y segura respecto al tipo.

protocol DownloadDelegate: AnyObject {
    func didFinish(_ bytes: Int)
}
class Downloader {
    weak var delegate: DownloadDelegate?
    func finish() { delegate?.didFinish(1024) }
}
print("Delegate is one-to-one and typed")

Delegado frente a notificación

Use un delegado cuando exactamente un objeto esté interesado y la relación sea clara. Use NotificationCenter cuando puedan reaccionar muchos observadores desconocidos.

import Foundation

// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")

Publishers de Combine

Combine modela los eventos como publishers a los que se suscribe con sink, y admite operadores de transformación como map y filter.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = c

Publisher de NotificationCenter

Combine sirve de puente con NotificationCenter: publisher(for:) convierte las notificaciones en un flujo que puede transformar.

import Foundation
import Combine

let name = Notification.Name("ping")
let c = NotificationCenter.default.publisher(for: name)
    .sink { _ in print("Combine got notification") }
NotificationCenter.default.post(name: name, object: nil)
_ = c

Operadores de Combine

La fortaleza de Combine es componer canalizaciones de eventos: filtrar, aplicar debounce, combinar y transformar valores de forma declarativa.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject
    .filter { $0 > 0 }
    .map { $0 * 2 }
    .sink { print($0) }
subject.send(-1)
subject.send(3)
_ = c

Secuencias asíncronas

El Swift moderno ofrece AsyncStream y secuencias asíncronas de notificaciones, lo que permite consumir eventos con for await en concurrencia estructurada.

import Foundation

func listen() async {
    let name = Notification.Name("ping")
    for await _ in NotificationCenter.default.notifications(named: name) {
        print("Async observed")
        break
    }
}
print("Can await notifications")

Closures y callbacks

Para un único callback local, lo más sencillo es una closure almacenada, sin ningún mecanismo de observadores.

struct Button {
    var onTap: () -> Void
    func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()

Elegir un enfoque

Delegado: uno a uno y explícito. NotificationCenter: muchos a muchos y desacoplado. Combine/asíncrono: flujos que necesitan transformación. Closure: callbacks locales sencillos.

import Foundation

// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")

Compromisos

NotificationCenter es flexible, pero no está tipado y puede provocar fugas fácilmente. La delegación y Combine son seguros respecto al tipo; Combine y las soluciones asíncronas ofrecen más potencia a cambio de añadir más conceptos.

import Foundation

// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")

Comprobación rápida

¿Qué mecanismo es más adecuado para una relación clara, de uno a uno y segura respecto al tipo?

Repaso

El patrón observer tiene varias formas en Swift: NotificationCenter para eventos desacoplados de muchos a muchos, delegación para vínculos tipados de uno a uno, Combine y secuencias asíncronas para flujos componibles, y closures para callbacks sencillos. Elija según la forma de comunicación y las necesidades de seguridad de tipos. Con esto termina el curso.

Preguntas frecuentes

¿La lección «Alternativas al patrón Observer» es gratis?

Sí — el texto completo de «Alternativas al patrón Observer» 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 «Alternativas al patrón Observer»?

Compare este patrón con delegates y publishers 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 «Alternativas al patrón Observer»?

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. Publicar y observar notificaciones
  2. Cargas userInfo de las notificaciones
  3. Eliminar observadores de forma segura
  4. Alternativas al patrón Observer
← Volver a Swift Academy