Swift Academy · Lezione

Alternative al pattern Observer

Confronti Observer con delegate e publisher di Combine.

Lezione 4 di 413 passaggi

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)
_ = c

Publisher 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)
_ = c

Operatori 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)
_ = c

Sequenze 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.

Gratis per iniziare

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

  1. Invio e osservazione delle notifiche
  2. Payload userInfo delle notifiche
  3. Rimozione sicura degli observer
  4. Alternative al pattern Observer
← Torna a Swift Academy