Main Thread Checker y bloqueos
Detecte trabajo de la interfaz en hilos secundarios y resuelva bloqueos del hilo principal.
Main Thread Checker y bloqueos es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.
Main Thread Checker
Main Thread Checker (MTC) es una herramienta de diagnóstico de Xcode que informa en tiempo de ejecución sobre las llamadas a las API de UIKit/AppKit realizadas desde hilos en segundo plano.
// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in XcodeInfracciones habituales de MTC
Actualizar la interfaz de usuario desde controladores de finalización o colas en segundo plano son las infracciones más frecuentes.
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
Marcar una clase o función con @MainActor garantiza que todos sus métodos se ejecuten en el hilo principal.
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var name = ""
func load() async {
name = try? await fetchName() // always on main thread
}
}¿Qué son los bloqueos?
Un bloqueo se produce cuando el hilo principal permanece bloqueado demasiado tiempo y la app deja de responder. El watchdog de iOS termina las apps que se bloquean durante el inicio (>20 s) o después de una acción del usuario.
// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueuesPlantilla Hangs de Instruments
El instrumento Hangs de Xcode 14 o posterior registra eventos de bloqueo con seguimientos de pila completos para diagnosticar el bloqueo del hilo principal.
// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loopsMain Thread Checker en las pruebas
MTC también se activa durante las pruebas de interfaz de usuario. Configúrelo en el esquema de pruebas para detectar infracciones en flujos de interfaz de usuario automatizados.
// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CIInformes de bloqueos de MetricKit
MetricKit recopila informes de bloqueos de las apps en producción mediante MXHangDiagnosticPayload.
func didReceive(_ payloads: [MXDiagnosticPayload]) {
payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
print($0.callStackTree)
}
}Detectar bloqueos con Instruments
Grabe un trazado y busque intervalos en los que el hilo principal esté ejecutándose, pero el enlace de pantalla no se active (fotogramas 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 occurredSoluciones asíncronas para bloqueos habituales
Mueva el trabajo que requiere mucha CPU fuera del hilo principal mediante Task.detached o async let.
// HANG:
let processed = heavyProcessing(image) // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
heavyProcessing(image)
}.valueEvitar API síncronas en el hilo principal
Reemplace la E/S de archivos y las llamadas de red síncronas por equivalentes asíncronos, o muévalas a una cola en 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) }.valueBucle de ejecución principal y temporizadores
Las operaciones prolongadas en el bucle de ejecución principal (en las devoluciones de llamada de RunLoop.main) también provocan bloqueos. Mueva los cálculos fuera del bucle 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() }
}Comprobación rápida
¿Qué garantiza añadir @MainActor a una clase respecto a sus llamadas a métodos?
Resumen de la lección
Active Main Thread Checker en el esquema Debug para detectar infracciones causadas por acceder a la interfaz desde segundo plano. Use @MainActor en los ViewModels y las vistas. Mueva el trabajo pesado fuera del hilo principal con Task.detached o colas en segundo plano. Use el instrumento Hangs y MXHangDiagnosticPayload de MetricKit para diagnosticar bloqueos del mundo real.
Preguntas frecuentes
¿La lección «Main Thread Checker y bloqueos» es gratis?
Sí — el texto completo de «Main Thread Checker y bloqueos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Main Thread Checker y bloqueos»?
Detecte trabajo de la interfaz en hilos secundarios y resuelva bloqueos del hilo principal. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Swift Academy?
No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Main Thread Checker y bloqueos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Swift Academy?
Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fundamentos de Instruments: Time Profiler
- Instruments Allocations y Leaks
- Main Thread Checker y bloqueos
- Optimización de rutas críticas: COW, inlining y especialización