0Pricing
Swift Academy · Lekcja

Alternatywy dla wzorca Observer

Porównanie z delegatami i publisherami Combine.

Alternatywy dla wzorca Observer to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Alternatywy dla wzorca obserwatora

NotificationCenter to jeden ze sposobów reagowania na zdarzenia. Swift oferuje także inne rozwiązania: delegowanie, Combine i sekwencje asynchroniczne. Każde z nich pasuje do innego modelu komunikacji.

Wzorzec obserwatora

Wzorzec obserwatora pozwala obiektom subskrybować zdarzenia pochodzące ze źródła. NotificationCenter jest globalną, luźno powiązaną implementacją tego wzorca.

import Foundation

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

Delegowanie

Delegat to relacja jeden-do-jednego: obiekt przekazuje określone zdarzenia pojedynczemu delegatowi za pośrednictwem protokołu. Jest to rozwiązanie jawne i bezpieczne typowo.

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

Delegat a powiadomienie

Użyj delegata, gdy dokładnie jeden obiekt jest zainteresowany zdarzeniem, a relacja jest jasno określona. Użyj NotificationCenter, gdy może reagować wielu nieznanych obserwatorów.

import Foundation

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

Wydawcy Combine

Combine modeluje zdarzenia jako wydawców, których subskrybuje się za pomocą sink; obsługuje też operatory transformacji, takie jak map i filter.

import Combine

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

Wydawca NotificationCenter

Combine integruje się z NotificationCenter: publisher(for:) zamienia powiadomienia w strumień, który można przekształcać.

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

Operatory Combine

Siłą Combine jest komponowanie potoków zdarzeń: deklaratywne filtrowanie, stosowanie debounce, łączenie i mapowanie wartości.

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

Sekwencje asynchroniczne

Współczesny Swift oferuje AsyncStream i asynchroniczne sekwencje powiadomień, dzięki czemu można odbierać zdarzenia za pomocą for await w ramach strukturalnej współbieżności.

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

Domknięcia i wywołania zwrotne

W przypadku pojedynczego, lokalnego wywołania zwrotnego najprostsze jest przechowywane domknięcie, bez żadnego mechanizmu obserwatorów.

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

Wybór podejścia

Delegat: relacja jeden-do-jednego, jawna. NotificationCenter: relacja wiele-do-wielu, niezależne obiekty. Combine/async: strumienie wymagające transformacji. Domknięcie: proste, lokalne wywołania zwrotne.

import Foundation

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

Kompromisy

NotificationCenter jest elastyczny, ale pozbawiony typowania i łatwo może prowadzić do wycieków. Delegowanie i Combine zapewniają bezpieczeństwo typów; Combine i rozwiązania asynchroniczne oferują większe możliwości kosztem większej liczby pojęć.

import Foundation

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

Szybkie sprawdzenie

Który mechanizm najlepiej nadaje się do jasnej relacji jeden-do-jednego, bezpiecznej typowo?

Podsumowanie

Wzorzec obserwatora ma w języku Swift kilka postaci: NotificationCenter obsługuje niezależne zdarzenia wiele-do-wielu, delegowanie — typowane relacje jeden-do-jednego, Combine i sekwencje asynchroniczne — komponowalne strumienie, a domknięcia — proste wywołania zwrotne. Wybieraj rozwiązanie na podstawie modelu komunikacji i wymagań dotyczących bezpieczeństwa typów. To kończy kurs.

Często zadawane pytania

Czy lekcja „Alternatywy dla wzorca Observer” jest bezpłatna?

Tak — pełny tekst „Alternatywy dla wzorca Observer” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Alternatywy dla wzorca Observer”?

Porównanie z delegatami i publisherami Combine. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Alternatywy dla wzorca Observer”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Publikowanie i obserwowanie powiadomień
  2. Ładunki userInfo powiadomień
  3. Bezpieczne usuwanie obserwatorów
  4. Alternatywy dla wzorca Observer
← Powrót do Swift Academy