Alternative al pattern Observer
Confronti Observer con delegate e publisher di Combine.
Alternative al pattern Observer è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Alternative al pattern Observer
NotificationCenter è un modo per reagire agli eventi. Swift ne offre altri: delegazione, Combine e sequenze asincrone. Ognuno è adatto a una forma diversa di comunicazione.
Il pattern Observer
Il pattern observer consente agli oggetti di iscriversi agli eventi di un soggetto. NotificationCenter ne è un'implementazione globale e debolmente accoppiata.
import Foundation
// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")Delegazione
Un delegate è un collegamento uno-a-uno: un oggetto inoltra eventi specifici a un singolo delegate tramite un protocollo. È esplicito e sicuro per i tipi.
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 e notifiche
Si utilizzi un delegate quando esattamente un oggetto è interessato e la relazione è chiara. Si utilizzi NotificationCenter quando possono reagire molti osservatori sconosciuti.
import Foundation
// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")Publisher di Combine
Combine modella gli eventi come publisher a cui ci si iscrive con sink e supporta operatori di trasformazione come map e filter.
import Combine
let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = cPublisher di NotificationCenter
Combine integra NotificationCenter: publisher(for:) trasforma le notifiche in un flusso che è possibile elaborare.
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)
_ = cOperatori di Combine
Il punto di forza di Combine è la composizione di pipeline di eventi: filter, debounce, combine e map in modo dichiarativo.
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)
_ = cSequenze asincrone
Swift moderno offre AsyncStream e sequenze asincrone di notifiche, consentendo di consumare gli eventi con for await nella concorrenza strutturata.
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")Closure e callback
Per un singolo callback locale, una closure memorizzata è la soluzione più semplice, senza alcun meccanismo di osservazione.
struct Button {
var onTap: () -> Void
func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()Scelta dell'approccio
Delegate: uno-a-uno, esplicito. NotificationCenter: molti-a-molti, disaccoppiato. Combine/async: flussi che richiedono trasformazioni. Closure: callback locali semplici.
import Foundation
// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")Compromessi
NotificationCenter è flessibile, ma privo di tipizzazione e facile da usare in modo da causare leak. Delegazione e Combine garantiscono la sicurezza dei tipi; Combine e async offrono più potenza al costo di introdurre più concetti.
import Foundation
// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")Verifica rapida
Quale meccanismo è più adatto a una relazione chiara, uno-a-uno e sicura per i tipi?
Riepilogo
Il pattern observer ha diverse forme in Swift: NotificationCenter per gli eventi molti-a-molti disaccoppiati, la delegazione per i collegamenti tipizzati uno-a-uno, Combine e le sequenze asincrone per flussi componibili e le closure per callback semplici. Si scelga in base alla forma della comunicazione e alle esigenze di sicurezza dei tipi. Il corso è completo.
Impara Swift con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 122
- Lezioni
- 409
Domande Frequenti
La lezione «Alternative al pattern Observer» è gratuita?
Sì — il testo completo di «Alternative al pattern Observer» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «Alternative al pattern Observer»?
Confronti Observer con delegate e publisher di Combine. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Alternative al pattern Observer»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Invio e osservazione delle notifiche
- Payload userInfo delle notifiche
- Rimozione sicura degli observer
- Alternative al pattern Observer