Встречается на 45% собеседований по Mobile

Что такое многопоточность

Многопоточность — это способность программы или центрального процессора выполнять несколько потоков (задач) одновременно, что позволяет повысить производительность и отзывчивость приложения. В контексте iOS-разработки многопоточность критически важна, так как UI-поток (main thread) должен оставаться свободным для обработки пользовательских действий, а тяжёлые операции (загрузка данных, вычисления) выполняются в фоновых потоках.

Основные понятия

  • Поток (Thread) — минимальная единица обработки, которой операционная система выделяет процессорное время. Каждый поток имеет свой стек и выполняется независимо.
  • Конкуренция (Concurrency) — способность программы делать прогресс в нескольких задачах одновременно за счёт быстрого переключения между ними. Это достигается даже на одноядерном процессоре.
  • Параллелизм (Parallelism) — одновременное выполнение нескольких операций на многоядерном процессоре. Параллелизм — это физическое выполнение, а конкуренция — логическое.

Как это работает в iOS

В iOS многопоточность реализуется через несколько уровней абстракции:

  • Thread — низкоуровневый API, который редко используется напрямую из-за сложности управления.
  • Grand Central Dispatch (GCD) — библиотека, которая управляет пулом потоков и предоставляет очереди (DispatchQueue). Вы добавляете задачу в очередь, и GCD сама решает, на каком потоке её выполнить.
  • OperationQueue — более высокоуровневая абстракция над GCD, позволяющая создавать зависимости между операциями, отменять их и контролировать приоритеты.

Пример использования GCD для асинхронной загрузки данных:

swift
// Выполняем тяжёлую задачу в фоновом потоке
DispatchQueue.global(qos: .userInitiated).async {
    let data = loadDataFromNetwork() // долгая операция
    
    // Возвращаемся на главный поток для обновления UI
    DispatchQueue.main.async {
        self.updateUI(with: data)
    }
}

Синхронизация и подводные камни

При работе с общими ресурсами (переменные, массивы, файлы) из нескольких потоков возникает гонка данных (data race) — непредсказуемое поведение из-за одновременного доступа. Для защиты используются:

  • Блокировки (NSLock, os_unfair_lock) — гарантируют, что только один поток может войти в критическую секцию.
  • Семафоры (DispatchSemaphore) — ограничивают количество потоков, работающих с ресурсом.
  • Барьеры (DispatchBarrier) — в GCD позволяют создать точку, где выполняются только записи, а чтения ждут.

Частые ошибки:

  • Обновление UI из фонового потока — приводит к краху или непредсказуемому поведению.
  • Дедлоки (deadlock) — когда два потока ждут друг друга, блокируя выполнение.
  • Чрезмерное создание потоков — увеличивает накладные расходы и снижает производительность.

Коротко

  • Многопоточность — параллельное выполнение задач для повышения отзывчивости и производительности.
  • В iOS используйте GCD и OperationQueue, а не сырые Thread.
  • Всегда возвращайте обновления UI на главный поток.
  • Защищайте общие ресурсы от гонок данных с помощью синхронизации.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы