Main Thread Checker e blocchi
Rilevare il lavoro dell’interfaccia eseguito su thread in background e risolvere i blocchi del main thread.
Main Thread Checker e blocchi è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Main Thread Checker
Il Main Thread Checker (MTC) è uno strumento diagnostico di Xcode che segnala a runtime le chiamate alle API UIKit/AppKit effettuate dai thread in background.
// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in XcodeViolazioni comuni rilevate da MTC
L'aggiornamento dell'interfaccia utente dai completion handler o dalle code in background è tra le violazioni più frequenti.
URLSession.shared.dataTask(with: url) { data, _, _ in
self.label.text = "Done" // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }MTC con async/await
Contrassegnare una classe o una funzione con @MainActor garantisce che tutti i suoi metodi vengano eseguiti sul thread principale.
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var name = ""
func load() async {
name = try? await fetchName() // always on main thread
}
}Che cosa sono i blocchi?
Si verifica un blocco quando il thread principale rimane bloccato troppo a lungo, rendendo l'app non reattiva. Il watchdog di iOS termina le app che si bloccano all'avvio (>20s) o dopo un'azione dell'utente.
// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueuesTemplate Hangs di Instruments
Lo strumento Hangs di Xcode 14 e versioni successive registra gli eventi di blocco con tracce complete dello stack per diagnosticare il blocco del thread principale.
// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loopsMain Thread Checker nei test
MTC interviene anche durante i test dell'interfaccia utente. Lo configuri nello schema di test per rilevare le violazioni nei flussi automatizzati dell'interfaccia.
// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CIReport dei blocchi di MetricKit
MetricKit raccoglie i report dei blocchi dalle app in produzione in MXHangDiagnosticPayload.
func didReceive(_ payloads: [MXDiagnosticPayload]) {
payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
print($0.callStackTree)
}
}Rilevamento dei blocchi con Instruments
Registri una traccia e cerchi gli intervalli di tempo in cui il thread principale è in esecuzione ma il display link non viene attivato (frame persi).
// Time Profiler: look for long CPU bursts on main thread
// Core Animation: FPS drops to 0 during hang
// Hangs instrument: highlights exact frames where hang occurredCorrezioni asincrone per i blocchi comuni
Sposti il lavoro che richiede molta CPU al di fuori del thread principale utilizzando Task.detached o async let.
// HANG:
let processed = heavyProcessing(image) // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
heavyProcessing(image)
}.valueEvitare le API sincrone sul thread principale
Sostituisca l'I/O sincrono sui file e le chiamate di rete con equivalenti asincroni oppure le sposti in una coda in background.
// HANG: synchronous file read on main thread
let data = try! Data(contentsOf: largeFileURL)
// FIX:
let data = try await Task.detached { try Data(contentsOf: largeFileURL) }.valueRun loop principale e timer
Anche le operazioni di lunga durata sul run loop principale (nei callback di RunLoop.main) causano blocchi. Sposti i calcoli al di fuori del run loop principale.
// AVOID: heavy work in main-thread timer callback
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
processAllItems() // slow!
}
// PREFER: dispatch to background
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
Task.detached { processAllItems() }
}Verifica rapida
Che cosa garantisce l'aggiunta di @MainActor a una classe riguardo alle chiamate ai suoi metodi?
Riepilogo della lezione
Attivi Main Thread Checker nello schema Debug per rilevare le violazioni causate dall'accesso all'interfaccia utente dai thread in background. Utilizzi @MainActor per ViewModel e viste. Sposti il lavoro pesante al di fuori del thread principale con Task.detached o code in background. Utilizzi lo strumento Hangs e MXHangDiagnosticPayload di MetricKit per diagnosticare i blocchi nel mondo reale.
Domande Frequenti
La lezione «Main Thread Checker e blocchi» è gratuita?
Sì — il testo completo di «Main Thread Checker e blocchi» è 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 «Main Thread Checker e blocchi»?
Rilevare il lavoro dell’interfaccia eseguito su thread in background e risolvere i blocchi del main thread. 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 3 di 4.
Quanto tempo richiede la lezione «Main Thread Checker e blocchi»?
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
- Fondamenti di Instruments: Time Profiler
- Strumenti Allocations e Leaks
- Main Thread Checker e blocchi
- Ottimizzare gli hot path: COW, inlining e specializzazione