NSNotificationCenter addObserver en Swift : Guide complet avec exemples concrets
Imaginez que vous développez une application de commande de pizza. L'utilisateur appuie sur « Payer » sur l'écran du panier, et quelques secondes plus tard, un autre écran — « Statut de la commande » — doit automatiquement afficher que la pizza est déjà en route. Comment relier ces deux écrans sans transformer le code en spaghetti de fermetures et de délégués ? La réponse est NSNotificationCenter (ou simplement NotificationCenter en Swift moderne).
Ce patron est l'un des plus populaires dans le développement iOS. Sur Stack Overflow, la question « NSNotificationCenter addObserver in Swift » cumule des milliers de vues, car même les développeurs expérimentés se perdent parfois dans la syntaxe, la gestion de la mémoire et la suppression des observateurs. Démêlons une fois pour toutes comment utiliser correctement les notifications en Swift.
Qu'est-ce que NotificationCenter et pourquoi en a-t-on besoin ?
NotificationCenter est un mécanisme intégré d'iOS qui implémente le patron « Observateur » (Observer). Il permet à certains objets (émetteurs) d'envoyer des messages, et à d'autres (observateurs) de s'abonner à ces messages et d'y réagir. Le principal avantage est le faible couplage : l'expéditeur et le destinataire ne se connaissent pas mutuellement.
Quand est-ce utile :
- Notifier un écran d'une action sur un autre (ex. : panier → statut de la commande)
- Réagir à des événements système (clavier apparu, application passée en arrière-plan)
- Mettre à jour l'interface utilisateur après un chargement de données en arrière-plan
Dans les anciens projets (Objective-C), on utilisait NSNotificationCenter ; en Swift à partir d'iOS 9, il s'appelle simplement NotificationCenter. Dans cet article, nous utiliserons la syntaxe Swift moderne.
Comment s'abonner à une notification : addObserver
La méthode addObserver est le cœur du système. Elle enregistre un objet comme observateur d'une notification spécifique. Il existe deux manières principales : via un sélecteur (classique) et via un bloc (fermeture).
1. Méthode addObserver avec sélecteur (target-action)
Cette méthode vient d'Objective-C. Vous spécifiez l'objet observateur, le sélecteur (la méthode qui sera appelée), le nom de la notification et, optionnellement, l'objet expéditeur.
import UIKit
class OrderStatusViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Abonnement à la notification de paiement NotificationCenter.default.addObserver( self, selector: #selector(didReceivePaymentNotification(_:)), name: Notification.Name("PaymentDidSucceed"), object: nil ) } @objc func didReceivePaymentNotification(_ notification: Notification) { print("Paiement réussi ! Mise à jour du statut de la commande.") // Mise à jour de l'interface ici } // IMPORTANT : ne pas oublier de se désabonner ! deinit { NotificationCenter.default.removeObserver(self) }}Ce qui est important ici :
- La méthode de gestion doit être marquée
@objc— c'est une exigence du runtime Objective-C. - Le paramètre
notificationde typeNotificationcontientuserInfo— un dictionnaire avec des données supplémentaires. - Si vous passez
object: nil, l'observateur recevra les notifications de n'importe quel expéditeur.
2. Méthode addObserver avec fermeture (iOS 9+)
Une manière moderne et plus sûre consiste à utiliser un bloc. Elle ne nécessite pas @objc et permet de capturer des variables externes.
class PaymentManager { private var observer: NSObjectProtocol? func startObservingPayment() { observer = NotificationCenter.default.addObserver( forName: Notification.Name("PaymentDidSucceed"),