Main Thread Checker e travamentos
Detecte trabalho de interface em threads de segundo plano e resolva travamentos da thread principal.
Main Thread Checker e travamentos é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Verificador da thread principal
O verificador da thread principal (MTC) é um diagnóstico do Xcode que relata, durante a execução, chamadas a APIs do UIKit/AppKit feitas a partir de threads em segundo plano.
// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in XcodeViolações comuns do MTC
Atualizar a interface do usuário a partir de manipuladores de conclusão ou de filas em segundo plano está entre as violações mais frequentes.
URLSession.shared.dataTask(with: url) { data, _, _ in
self.label.text = "Done" // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }MTC com async/await
Marcar uma classe ou função com @MainActor garante que todos os seus métodos sejam executados na thread principal.
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var name = ""
func load() async {
name = try? await fetchName() // always on main thread
}
}O que são travamentos
Um travamento ocorre quando a thread principal fica bloqueada por tempo demais, deixando o aplicativo sem resposta. O mecanismo de vigilância do iOS encerra aplicativos que travam na inicialização (mais de 20 s) ou depois de uma ação do usuário.
// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueuesModelo de travamentos do Instruments
O instrumento Hangs do Xcode 14 ou posterior registra eventos de travamento com rastreamentos de pilha completos para diagnosticar bloqueios da thread principal.
// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loopsVerificador da thread principal em testes
O MTC também é acionado durante testes de interface. Configure-o no esquema de testes para detectar violações em fluxos de interface automatizados.
// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CIRelatórios de travamentos do MetricKit
O MetricKit coleta relatórios de travamentos de aplicativos em produção em MXHangDiagnosticPayload.
func didReceive(_ payloads: [MXDiagnosticPayload]) {
payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
print($0.callStackTree)
}
}Detectando travamentos com o Instruments
Grave um rastreamento e procure intervalos em que a thread principal está executando, mas o enlace de exibição não é acionado (quadros perdidos).
// 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 occurredCorreções assíncronas para travamentos comuns
Mova o trabalho pesado de CPU para fora da thread principal usando Task.detached ou async let.
// HANG:
let processed = heavyProcessing(image) // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
heavyProcessing(image)
}.valueEvitando APIs síncronas na thread principal
Substitua operações síncronas de entrada e saída de arquivos e chamadas de rede por equivalentes assíncronos ou mova-as para uma fila em segundo plano.
// 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 principal e temporizadores
Operações de longa duração no ciclo de execução principal (em callbacks de RunLoop.main) também causam travamentos. Mova a computação para fora do ciclo principal.
// 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ção rápida
O que adicionar @MainActor a uma classe garante sobre as chamadas de seus métodos?
Recapitulação da lição
Ative o verificador da thread principal no esquema Debug para detectar violações causadas pelo acesso à interface a partir de threads em segundo plano. Use @MainActor em ViewModels e visualizações. Mova o trabalho pesado para fora da thread principal com Task.detached ou filas em segundo plano. Use o instrumento Hangs e MXHangDiagnosticPayload do MetricKit para diagnosticar travamentos no mundo real.
Perguntas Frequentes
A aula “Main Thread Checker e travamentos” é grátis?
Sim — o texto completo de “Main Thread Checker e travamentos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Main Thread Checker e travamentos”?
Detecte trabalho de interface em threads de segundo plano e resolva travamentos da thread principal. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Main Thread Checker e travamentos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos do Instruments: Time Profiler
- Instruments Allocations e Leaks
- Main Thread Checker e travamentos
- Otimização de caminhos críticos: COW, inlining e especialização