NSNotificationCenter addObserver en Swift: Guía completa con ejemplos prácticos
Imagina que estás escribiendo una aplicación para pedir pizza. El usuario presiona «Pagar» en la pantalla del carrito, y unos segundos después, otra pantalla — «Estado del pedido» — debe mostrar automáticamente que la pizza ya está en camino. ¿Cómo conectar estas dos pantallas sin convertir el código en un espagueti de closures y delegados? La respuesta es NSNotificationCenter (y en Swift moderno, simplemente NotificationCenter).
Este patrón es uno de los más populares en el desarrollo de iOS. En Stack Overflow, la pregunta «NSNotificationCenter addObserver in Swift» acumula miles de visitas porque incluso desarrolladores experimentados a veces se confunden con la sintaxis, la gestión de memoria y la eliminación de observadores. Aclaremos de una vez por todas cómo usar correctamente las notificaciones en Swift.
¿Qué es NotificationCenter y para qué sirve?
NotificationCenter es un mecanismo integrado de iOS que implementa el patrón «Observador» (Observer). Permite que unos objetos (emisores) envíen mensajes y que otros (observadores) se suscriban a esos mensajes y reaccionen a ellos. La principal ventaja es el acoplamiento débil: el emisor y el receptor no saben nada el uno del otro.
¿Cuándo es útil?
- Notificar a una pantalla sobre una acción en otra (por ejemplo, carrito → estado del pedido)
- Reaccionar a eventos del sistema (el teclado apareció, la aplicación pasó a segundo plano)
- Actualizar la interfaz de usuario después de completar una carga de datos en segundo plano
En proyectos antiguos (Objective-C) se usaba NSNotificationCenter; en Swift, a partir de iOS 9, se llama simplemente NotificationCenter. En este artículo usaremos la sintaxis moderna de Swift.
Cómo suscribirse a una notificación: addObserver
El método addObserver es el corazón del sistema. Registra un objeto como observador de una notificación específica. Hay dos formas principales: mediante selector (clásica) y mediante bloque (closure).
1. Método addObserver con selector (target-action)
Este método proviene de Objective-C. Especificas el objeto observador, el selector (método que se llamará), el nombre de la notificación y, opcionalmente, el objeto emisor.
import UIKit
class OrderStatusViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Nos suscribimos a la notificación de pago NotificationCenter.default.addObserver( self, selector: #selector(didReceivePaymentNotification(_:)), name: Notification.Name("PaymentDidSucceed"), object: nil ) } @objc func didReceivePaymentNotification(_ notification: Notification) { print("¡Pago exitoso! Actualizando el estado del pedido.") // Aquí actualizamos la UI } // IMPORTANTE: ¡no olvides cancelar la suscripción! deinit { NotificationCenter.default.removeObserver(self) }}¿Qué es importante aquí?
- El método manejador debe estar marcado con
@objc— es un requisito del runtime de Objective-C. - El parámetro
notificationde tipoNotificationcontieneuserInfo— un diccionario con datos adicionales. - Si pasas
object: nil, el observador recibirá notificaciones de cualquier emisor.
2. Método addObserver con closure (iOS 9+)
Una forma más moderna y segura es usar un bloque. No requiere @objc y permite capturar variables externas.
class PaymentManager { private var observer: NSObjectProtocol? func startObservingPayment() { observer = NotificationCenter.default.addObserver( forName: Notification.Name("PaymentDidSucceed"),