0Pricing
Swift Academy · Lezione

Scheduler e threading

Controlli l’esecuzione con receive(on:) e subscribe(on:).

Scheduler e threading è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 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.

Gli scheduler in Combine

Uno scheduler in Combine definisce quando e dove viene eseguito il lavoro: quale thread o coda esegue gli operatori e consegna i valori ai subscriber.

Controllare gli scheduler è essenziale per mantenere gli aggiornamenti dell'interfaccia utente sul thread principale e il lavoro pesante al di fuori di esso.

Due operatori fondamentali

Combine offre due operatori per controllare l'esecuzione sui thread:

  • subscribe(on:) — controlla dove iniziano la sottoscrizione e il lavoro upstream
  • receive(on:) — controlla dove vengono consegnati i valori downstream

Agiscono su estremità diverse della pipeline.

receive(on:)

receive(on:) sposta tutto ciò che viene dopo di esso sullo scheduler specificato. L'uso più comune consiste nel tornare alla coda principale prima di aggiornare l'interfaccia utente.

apiClient.fetchUser(id: 1)
    .receive(on: DispatchQueue.main)
    .sink { user in
        self.nameLabel.text = user.name
    }
    .store(in: &cancellables)

subscribe(on:)

subscribe(on:) controlla il thread su cui il publisher inizia a produrre valori e su cui vengono eseguiti gli operatori upstream. Lo utilizzi per spostare l'impostazione iniziale costosa fuori dal thread principale.

heavyPublisher
    .subscribe(on: DispatchQueue.global(qos: .userInitiated))
    .receive(on: DispatchQueue.main)
    .sink { result in
        self.update(result)
    }
    .store(in: &cancellables)

subscribe(on:) e receive(on:) a confronto

Ricordi la direzione:

  • subscribe(on:) agisce sull'upstream: dove inizia il lavoro
  • receive(on:) agisce sul downstream: dove vengono consegnati i risultati

Un pattern tipico usa subscribe(on:) per il lavoro in background e receive(on:) per la consegna sul thread principale.

DispatchQueue come scheduler

DispatchQueue si conforma al protocollo Scheduler. DispatchQueue.main consegna i valori sul thread principale; le code globali vengono eseguite in concorrenza in background.

let background = DispatchQueue.global(qos: .background)

publisher
    .map { expensiveTransform($0) }
    .subscribe(on: background)
    .receive(on: DispatchQueue.main)
    .sink { self.render($0) }
    .store(in: &cancellables)

RunLoop come scheduler

RunLoop è un altro scheduler, associato al run loop di un thread. RunLoop.main consegna i valori in coordinamento con gli eventi dell'interfaccia utente, un aspetto che può essere importante, ad esempio, per la reattività dello scorrimento.

timerPublisher
    .receive(on: RunLoop.main)
    .sink { _ in
        self.tick()
    }
    .store(in: &cancellables)

DispatchQueue e RunLoop a confronto

Entrambi possono consegnare i valori sul thread principale, ma presentano sottili differenze:

  • DispatchQueue.main — pianifica il lavoro anche durante il tracciamento dello scorrimento
  • RunLoop.main — rimanda il lavoro mentre il run loop è in modalità di tracciamento

Per la maggior parte degli aggiornamenti dell'interfaccia utente dopo un lavoro asincrono, DispatchQueue.main è l'impostazione predefinita più sicura.

Operatori di temporizzazione degli scheduler

Operatori come debounce, throttle e delay ricevono tutti un argomento scheduler che determina quale coda gestisce la temporizzazione.

searchTextPublisher
    .debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
    .sink { query in
        self.runSearch(query)
    }
    .store(in: &cancellables)

Un errore comune nei thread

Aggiornare l'interfaccia utente fuori dal thread principale causa crash o anomalie visive. Se dimentica receive(on: DispatchQueue.main) dopo un publisher in background, il Suo sink potrebbe essere eseguito su un thread in background.

Consegni sempre i valori destinati all'interfaccia utente sullo scheduler principale.

Mettere tutto insieme

Una pipeline robusta avvia il lavoro in background, lo elabora nello stesso contesto e infine consegna il risultato al thread principale per la visualizzazione.

imageURLPublisher
    .subscribe(on: DispatchQueue.global())
    .flatMap { url in downloadImage(url) }
    .map { resize($0) }
    .receive(on: DispatchQueue.main)
    .sink { self.imageView.image = $0 }
    .store(in: &cancellables)

Verifica rapida

Verifichi le Sue conoscenze sugli scheduler.

Riepilogo

Ha imparato a controllare l'esecuzione sui thread in Combine:

  • subscribe(on:) — dove inizia il lavoro upstream
  • receive(on:) — dove vengono consegnati i risultati
  • DispatchQueue e RunLoop come scheduler
  • Consegnare sempre gli aggiornamenti dell'interfaccia utente sul thread principale

Una pianificazione corretta mantiene le app reattive e prive di crash.

Domande Frequenti

La lezione «Scheduler e threading» è gratuita?

Sì — il testo completo di «Scheduler e threading» è 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 «Scheduler e threading»?

Controlli l’esecuzione con receive(on:) e subscribe(on:). 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 2 di 4.

Quanto tempo richiede la lezione «Scheduler e threading»?

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. Trasformazione e combinazione degli stream
  2. Scheduler e threading
  3. Operatori per la gestione degli errori
  4. Publisher e subscriber personalizzati
← Torna a Swift Academy