Alternativer til observer pattern
Sammenlign med delegates og Combine publishers.
Alternativer til observer pattern er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 4 lektioner i alt.
Alternativer til observatørmønsteret
NotificationCenter er én måde at reagere på hændelser på. Swift tilbyder andre muligheder: delegering, Combine og asynkrone streams. Hver mulighed passer til en forskellig form for kommunikation.
Observatørmønsteret
Observatørmønsteret lader objekter abonnere på hændelser fra et subjekt. NotificationCenter er en global og løst koblet implementering af mønsteret.
import Foundation
// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")Delegering
En delegat er en én-til-én-forbindelse: Et objekt videresender bestemte hændelser til én enkelt delegat via en protokol. Det er eksplicit og typesikkert.
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 kontra notifikation
Brug en delegat, når præcis ét objekt er interesseret, og forholdet er tydeligt. Brug NotificationCenter, når mange ukendte observatører kan reagere.
import Foundation
// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")Combine-udgivere
Combine modellerer hændelser som udgivere, som du abonnerer på med sink, og understøtter transformationsoperatorer som map og filter.
import Combine
let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = cNotificationCenter-udgiver
Combine forbinder NotificationCenter med resten af systemet: publisher(for:) omdanner notifikationer til en strøm, som du kan transformere.
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)
_ = cCombine-operatorer
Combines styrke er at sammensætte hændelsesforløb: filtrere, debounce, kombinere og mappe værdier deklarativt.
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)
_ = cAsynkrone sekvenser
Moderne Swift tilbyder AsyncStream og asynkrone notifikationssekvenser, så du kan behandle hændelser med for await i struktureret samtidighed.
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 og tilbagekald
Til ét enkelt, lokalt tilbagekald er en gemt closure den enkleste løsning, helt uden observatormekanik.
struct Button {
var onTap: () -> Void
func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()Valg af tilgang
Delegat: én-til-én, eksplicit. NotificationCenter: mange-til-mange, afkoblet. Combine/asynkrone sekvenser: strømme, der kræver transformation. Closure: enkle lokale tilbagekald.
import Foundation
// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")Afvejninger
NotificationCenter er fleksibelt, men uden typekontrol og let at få til at lække. Delegering og Combine er typesikre; Combine og asynkron kode giver mere kraft på bekostning af flere begreber.
import Foundation
// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")Hurtigt tjek
Hvilken mekanisme er bedst til en tydelig, typesikker én-til-én-relation?
Opsummering
Observatørmønsteret findes i flere former i Swift: NotificationCenter til afkoblede hændelser mellem mange afsendere og modtagere, delegering til typetilpassede én-til-én-forbindelser, Combine og asynkrone sekvenser til strømme, der kan sammensættes, samt closures til enkle tilbagekald. Vælg ud fra kommunikationsformen og behovet for typesikkerhed. Det afslutter kurset.
Lær Swift med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 122
- Lektioner
- 409
Ofte stillede spørgsmål
Er lektionen “Alternativer til observer pattern” gratis?
Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Alternativer til observer pattern”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Alternativer til observer pattern”?
Sammenlign med delegates og Combine publishers. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Swift Academy?
Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Alternativer til observer pattern”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Swift Academy-lektion?
Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Publicering og observation af notifikationer
- Notification userInfo-payloads
- Sikker fjernelse af observers
- Alternativer til observer pattern