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)
_ = cWydawca 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)
_ = cOperatory 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)
_ = cSekwencje 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
- Publikowanie i obserwowanie powiadomień
- Ładunki userInfo powiadomień
- Bezpieczne usuwanie obserwatorów
- Alternatywy dla wzorca Observer