NSNotificationCenter addObserver em Swift: Guia completo com exemplos práticos
Imagine que você está escrevendo um aplicativo para pedir pizza. O usuário clica em "Pagar" na tela do carrinho e, alguns segundos depois, outra tela — "Status do Pedido" — deve mostrar automaticamente que a pizza já está a caminho. Como conectar essas duas telas sem transformar o código em um espaguete de closures e delegates? A resposta é NSNotificationCenter (no Swift moderno, apenas NotificationCenter).
Este padrão é um dos mais populares no desenvolvimento iOS. No Stack Overflow, a pergunta "NSNotificationCenter addObserver in Swift" recebe milhares de visualizações, porque até desenvolvedores experientes às vezes se confundem com a sintaxe, gerenciamento de memória e remoção de observadores. Vamos entender de uma vez por todas como usar notificações corretamente em Swift.
O que é NotificationCenter e para que serve?
NotificationCenter é um mecanismo embutido do iOS que implementa o padrão "Observador" (Observer). Ele permite que objetos (remetentes) enviem mensagens e que outros (observadores) se inscrevam nessas mensagens e reajam a elas. A principal vantagem é o baixo acoplamento: o remetente e o receptor não sabem nada um sobre o outro.
Quando é útil:
- Notificar uma tela sobre uma ação em outra (ex: carrinho → status do pedido)
- Reagir a eventos do sistema (teclado apareceu, aplicativo foi para segundo plano)
- Atualizar a UI após a conclusão de um carregamento de dados em segundo plano
Em projetos antigos (Objective-C), usava-se NSNotificationCenter; no Swift a partir do iOS 9, ele é chamado simplesmente de NotificationCenter. Neste artigo, usaremos a sintaxe moderna do Swift.
Como se inscrever em uma notificação: addObserver
O método addObserver é o coração do sistema. Ele registra um objeto como observador de uma determinada notificação. Existem duas formas principais: via seletor (clássica) e via bloco (closure).
1. Método addObserver com seletor (target-action)
Esta forma veio do Objective-C. Você especifica o objeto observador, o seletor (método que será chamado), o nome da notificação e, opcionalmente, o objeto remetente.
import UIKit
class OrderStatusViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Inscrevendo-se na notificação de pagamento NotificationCenter.default.addObserver( self, selector: #selector(didReceivePaymentNotification(_:)), name: Notification.Name("PaymentDidSucceed"), object: nil ) } @objc func didReceivePaymentNotification(_ notification: Notification) { print("Pagamento realizado com sucesso! Atualizando status do pedido.") // Aqui atualizamos a UI } // IMPORTANTE: não esquecer de cancelar a inscrição! deinit { NotificationCenter.default.removeObserver(self) }}O que é importante aqui:
- O método manipulador deve ser marcado com
@objc— requisito do runtime do Objective-C. - O parâmetro
notificationdo tipoNotificationcontémuserInfo— um dicionário com dados adicionais. - Se passar
object: nil, o observador receberá notificações de qualquer remetente.
2. Método addObserver com closure (iOS 9+)
Uma forma moderna e mais segura é usar um bloco. Ela não requer @objc e permite capturar variáveis externas.
class PaymentManager { private var observer: NSObjectProtocol? func startObservingPayment() { observer = NotificationCenter.default.addObserver( forName: Notification.Name("PaymentDidSucceed"),