Каковы рекомендации по количеству потоков в iOS-приложении?

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

Ответ

Прямое создание большого количества потоков (Thread) является антипаттерном. Вместо этого используются высокоуровневые абстракции, которые сами управляют пулом потоков.

Рекомендуемые подходы и ограничения:

  1. Главный поток (Main Thread): Один. Используется исключительно для операций с UI.
  2. Grand Central Dispatch (GCD):
    • Система автоматически управляет пулом потоков.
    • Разработчик работает с очередями (DispatchQueue), а не потоками напрямую.
    • Количество потоков в пуле оптимизировано системой под доступные CPU-ядра.
  3. OperationQueue:
    • Позволяет явно ограничить параллелизм через maxConcurrentOperationCount.
    • Рекомендуемое значение — порядка количества CPU-ядер (например, 2-8).

Примеры:

// GCD: Система сама выберет оптимальный поток из пула.
DispatchQueue.global(qos: .userInitiated).async {
    let result = performHeavyCalculation()
    DispatchQueue.main.async { updateUI(with: result) }
}

// OperationQueue: Явное ограничение параллельных задач.
let processingQueue = OperationQueue()
processingQueue.name = "com.example.processing"
processingQueue.maxConcurrentOperationCount = 4 // Оптимально для большинства задач
processingQueue.addOperation { processDataChunk() }

Ключевой вывод: Не создавайте потоки вручную. Используйте GCD или OperationQueue, позволяя системе эффективно распределять работу по доступным ядрам CPU и избегая overload (чрезмерного переключения контекста).