0Pricing
Swift Academy · Aula

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 Xcode

Violaçõ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 DispatchQueues

Modelo 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 loops

Verificador 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 CI

Relató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 occurred

Correçõ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)
}.value

Evitando 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) }.value

Run 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

  1. Fundamentos do Instruments: Time Profiler
  2. Instruments Allocations e Leaks
  3. Main Thread Checker e travamentos
  4. Otimização de caminhos críticos: COW, inlining e especialização
← Voltar para Swift Academy