NSNotificationCenter addObserver in Swift: Vollständige Anleitung mit praktischen Beispielen
Stell dir vor, du schreibst eine App zum Bestellen von Pizza. Der Benutzer tippt auf «Bezahlen» im Warenkorb-Bildschirm, und ein paar Sekunden später soll ein anderer Bildschirm – der «Bestellstatus» – automatisch anzeigen, dass die Pizza bereits unterwegs ist. Wie verbindest du diese beiden Bildschirme, ohne den Code in ein Spaghetti aus Closures und Delegaten zu verwandeln? Die Antwort ist NSNotificationCenter (im modernen Swift einfach NotificationCenter).
Dieses Pattern ist eines der beliebtesten in der iOS-Entwicklung. Auf Stack Overflow erhält die Frage «NSNotificationCenter addObserver in Swift» tausende Aufrufe, weil selbst erfahrene Entwickler manchmal bei der Syntax, der Speicherverwaltung und dem Entfernen von Beobachtern durcheinanderkommen. Lass uns ein für alle Mal klären, wie man Benachrichtigungen in Swift richtig verwendet.
Was ist NotificationCenter und wozu braucht man es?
NotificationCenter ist ein integrierter Mechanismus von iOS, der das «Beobachter»-Pattern (Observer) implementiert. Er ermöglicht es, dass Objekte (Poster) Nachrichten senden und andere (Beobachter) diese Nachrichten abonnieren und darauf reagieren können. Der Hauptvorteil ist die lose Kopplung: Sender und Empfänger wissen nichts voneinander.
Wann ist das nützlich:
- Benachrichtigung eines Bildschirms über eine Aktion auf einem anderen (z.B. Warenkorb → Bestellstatus)
- Reaktion auf Systemereignisse (Tastatur erschienen, App in den Hintergrund gegangen)
- Aktualisierung der UI nach Abschluss eines Hintergrund-Datenladens
In alten Projekten (Objective-C) wurde NSNotificationCenter verwendet, in Swift ab iOS 9 heißt es einfach NotificationCenter. In diesem Artikel verwenden wir die moderne Swift-Syntax.
Wie abonniert man eine Benachrichtigung: addObserver
Die Methode addObserver ist das Herz des Systems. Sie registriert ein Objekt als Beobachter einer bestimmten Benachrichtigung. Es gibt zwei Hauptmethoden: über einen Selektor (klassisch) und über einen Block (Closure).
1. Die addObserver-Methode mit Selektor (target-action)
Diese Methode stammt noch aus Objective-C. Du gibst das beobachtende Objekt, einen Selektor (die Methode, die aufgerufen wird), den Namen der Benachrichtigung und optional das sendende Objekt an.
import UIKit
class OrderStatusViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Benachrichtigung über Zahlung abonnieren NotificationCenter.default.addObserver( self, selector: #selector(didReceivePaymentNotification(_:)), name: Notification.Name("PaymentDidSucceed"), object: nil ) } @objc func didReceivePaymentNotification(_ notification: Notification) { print("Zahlung erfolgreich! Bestellstatus wird aktualisiert.") // Hier UI aktualisieren } // WICHTIG: Nicht vergessen, sich abzumelden! deinit { NotificationCenter.default.removeObserver(self) }}Was hier wichtig ist:
- Die Handler-Methode muss mit
@objcmarkiert sein – dies ist eine Anforderung der Objective-C-Laufzeit. - Der Parameter
notificationvom TypNotificationenthältuserInfo– ein Wörterbuch mit zusätzlichen Daten. - Wenn du
object: nilübergibst, erhält der Beobachter Benachrichtigungen von jedem Absender.
2. Die addObserver-Methode mit Closure (iOS 9+)
Eine moderne und sicherere Methode ist die Verwendung eines Blocks. Sie benötigt kein @objc und ermöglicht das Erfassen externer Variablen.
class PaymentManager { private var observer: NSObjectProtocol? func startObservingPayment() { observer = NotificationCenter.default.addObserver( forName: Notification.Name("PaymentDidSucceed"),