В чем разница между асинхронностью, многопоточностью и многопроцессингом в iOS?

«В чем разница между асинхронностью, многопоточностью и многопроцессингом в iOS?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Асинхронность — это стиль программирования, при котором задачи выполняются неблокирующе, не дожидаясь завершения предыдущей операции. Поток может приостановить задачу и переключиться на другую, а затем вернуться к результату. Реализуется через DispatchQueue, async/await (Concurrency) или completion handlers.

Многопоточность — параллельное выполнение нескольких потоков в рамках одного процесса. Потоки разделяют память процесса. В iOS управляется через GCD (DispatchQueue) или Thread. Используется для фоновых вычислений, не блокирующих UI.

Многопроцессинг — параллельная работа нескольких независимых процессов, каждый со своей изолированной памятью. В iOS используется редко (например, для некоторых системных расширений через Process), так как приложения обычно однопроцессные.

Ключевые отличия:

  • Уровень абстракции: Асинхронность — это парадигма, многопоточность и многопроцессинг — механизмы реализации параллелизма.
  • Изоляция памяти: Потоки в многопоточности разделяют память, процессы в многопроцессинге — нет.
  • Типичное применение в iOS:
    • Асинхронность: сетевые запросы, обработка файлов.
    • Многопоточность: фоновая обработка изображений, параллельные вычисления.
    • Многопроцессинг: специфичные системные задачи.

Пример асинхронности с GCD:

// Не блокирует главный поток
DispatchQueue.global(qos: .userInitiated).async {
    let data = performHeavyCalculation()
    DispatchQueue.main.async {
        updateUI(with: data)
    }
}

Пример многопоточности (параллельные задачи):

let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async { task1() }
concurrentQueue.async { task2() } // Могут выполняться одновременно