0Pricing
Swift Academy · Lektion

Alternativen zum Observer-Pattern

Vergleichen Sie es mit Delegates und Combine-Publishern.

Alternativen zum Observer-Pattern ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Alternativen zum Beobachtermuster

NotificationCenter ist eine Möglichkeit, auf Ereignisse zu reagieren. Swift bietet weitere: Delegation, Combine und asynchrone Streams. Jede Variante eignet sich für eine andere Form der Kommunikation.

Das Beobachtermuster

Das Beobachtermuster ermöglicht es Objekten, Ereignisse eines Subjekts zu abonnieren. NotificationCenter ist eine globale, lose gekoppelte Implementierung dieses Musters.

import Foundation

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

Delegation

Ein Delegate ist eine Eins-zu-eins-Verbindung: Ein Objekt leitet bestimmte Ereignisse über ein Protokoll an genau ein Delegate weiter. Das ist explizit und typsicher.

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")

Delegate oder Benachrichtigung

Verwenden Sie ein Delegate, wenn genau ein Objekt interessiert ist und die Beziehung eindeutig ist. Verwenden Sie NotificationCenter, wenn viele, nicht näher bekannte Beobachter reagieren können.

import Foundation

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

Combine-Publisher

Combine modelliert Ereignisse als Publisher, die Sie mit sink abonnieren. Dabei werden Transformationsoperatoren wie map und filter unterstützt.

import Combine

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

NotificationCenter-Publisher

Combine verbindet sich mit NotificationCenter: publisher(for:) wandelt Benachrichtigungen in einen Stream um, den Sie transformieren können.

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

Combine-Operatoren

Die Stärke von Combine liegt in der Zusammensetzung von Ereignispipelines: Sie können Werte deklarativ filtern, verzögert verarbeiten, kombinieren und mit map umwandeln.

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

Asynchrone Sequenzen

Modernes Swift bietet AsyncStream und asynchrone Benachrichtigungssequenzen, sodass Sie Ereignisse mit for await in strukturierter Nebenläufigkeit verarbeiten können.

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 und Callbacks

Für einen einzelnen, lokalen Callback ist eine gespeicherte Closure am einfachsten, ganz ohne Beobachtermechanismus.

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

Den passenden Ansatz wählen

Delegate: Eins-zu-eins, explizit. NotificationCenter: Viele-zu-viele, entkoppelt. Combine/async: Streams, die Transformationen benötigen. Closure: einfache lokale Callbacks.

import Foundation

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

Abwägungen

NotificationCenter ist flexibel, aber nicht typsicher und kann leicht zu Leaks führen. Delegation und Combine sind typsicher; Combine und async bieten mehr Möglichkeiten, bringen aber zusätzliche Konzepte mit sich.

import Foundation

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

Kurze Überprüfung

Welcher Mechanismus eignet sich am besten für eine eindeutige, typsichere Eins-zu-eins-Beziehung?

Zusammenfassung

Das Beobachtermuster hat in Swift mehrere Ausprägungen: NotificationCenter für entkoppelte Ereignisse mit vielen Sendern und Empfängern, Delegation für typisierte Eins-zu-eins-Verbindungen, Combine und asynchrone Sequenzen für kombinierbare Streams sowie Closures für einfache Callbacks. Wählen Sie anhand der Kommunikationsform und der Anforderungen an die Typsicherheit. Damit ist der Kurs abgeschlossen.

Häufig gestellte Fragen

Ist die Lektion „Alternativen zum Observer-Pattern“ kostenlos?

Ja — der vollständige Text von „Alternativen zum Observer-Pattern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Alternativen zum Observer-Pattern“?

Vergleichen Sie es mit Delegates und Combine-Publishern. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Alternativen zum Observer-Pattern“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Benachrichtigungen senden und beobachten
  2. Notification-userInfo-Payloads
  3. Observer sicher entfernen
  4. Alternativen zum Observer-Pattern
← Zurück zu Swift Academy