0Pricing
Swift Academy · Урок

Проверка главного потока и зависания

Обнаруживайте работу с интерфейсом в фоновых потоках и устраняйте зависания главного потока.

«Проверка главного потока и зависания» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы Instruments: Time Profiler
  2. Инструменты Allocations и Leaks
  3. Проверка главного потока и зависания
  4. Оптимизация узких мест: COW, встраивание и специализация
← Назад к Swift Academy