Проверка главного потока и зависания
Обнаруживайте работу с интерфейсом в фоновых потоках и устраняйте зависания главного потока.
«Проверка главного потока и зависания» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Проверка главного потока
Проверка главного потока (MTC) — это диагностический инструмент Xcode, который во время выполнения сообщает о вызовах API UIKit/AppKit из фоновых потоков.
// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in XcodeРаспространённые нарушения MTC
Обновление интерфейса из обработчиков завершения или фоновых очередей — наиболее частые нарушения.
URLSession.shared.dataTask(with: url) { data, _, _ in
self.label.text = "Done" // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }MTC и async/await
Указание @MainActor для класса или функции гарантирует, что все его методы выполняются в главном потоке.
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var name = ""
func load() async {
name = try? await fetchName() // always on main thread
}
}Что такое зависания
Зависание возникает, когда главный поток слишком долго заблокирован, из-за чего приложение перестаёт отвечать. Сторожевой таймер iOS завершает приложения, зависшие при запуске (более 20 с) или после действия пользователя.
// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueuesШаблон зависаний Instruments
Инструмент зависаний в Xcode 14 и более новых версиях записывает события зависаний с полными трассировками стека, чтобы диагностировать блокировку главного потока.
// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loopsПроверка главного потока в тестах
MTC также срабатывает во время тестов интерфейса. Настройте его в схеме тестирования, чтобы обнаруживать нарушения в автоматизированных сценариях интерфейса.
// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CIОтчёты о зависаниях MetricKit
MetricKit собирает отчёты о зависаниях рабочих приложений в MXHangDiagnosticPayload.
func didReceive(_ payloads: [MXDiagnosticPayload]) {
payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
print($0.callStackTree)
}
}Обнаружение зависаний с помощью Instruments
Запишите трассировку и найдите интервалы, в течение которых главный поток выполняется, но ссылка отображения не срабатывает (кадры пропускаются).
// 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Асинхронные исправления распространённых зависаний
Перенесите ресурсоёмкую работу CPU с главного потока с помощью Task.detached или async let.
// HANG:
let processed = heavyProcessing(image) // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
heavyProcessing(image)
}.valueОтказ от синхронных API в главном потоке
Замените синхронные операции ввода-вывода с файлами и сетевые вызовы асинхронными аналогами или перенесите их в фоновую очередь.
// 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Главный цикл выполнения и таймеры
Длительные операции в главном цикле выполнения (в обратных вызовах RunLoop.main) также вызывают зависания. Перенесите вычисления из главного цикла.
// 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() }
}Быстрая проверка
Что гарантирует добавление @MainActor к классу относительно вызовов его методов?
Итоги урока
Включите проверку главного потока в схеме отладки, чтобы обнаруживать обращения к интерфейсу из фоновых потоков. Используйте @MainActor для ViewModels и представлений. Переносите ресурсоёмкую работу с главного потока с помощью Task.detached или фоновых очередей. Используйте инструмент зависаний и MXHangDiagnosticPayload MetricKit для диагностики зависаний в реальных условиях.
Часто задаваемые вопросы
Урок «Проверка главного потока и зависания» бесплатный?
Да — полный текст урока «Проверка главного потока и зависания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Проверка главного потока и зависания»?
Обнаруживайте работу с интерфейсом в фоновых потоках и устраняйте зависания главного потока. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Проверка главного потока и зависания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы Instruments: Time Profiler
- Инструменты Allocations и Leaks
- Проверка главного потока и зависания
- Оптимизация узких мест: COW, встраивание и специализация