Существует ли Run Loop на глобальных потоках (GCD) в iOS?

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

Ответ

Да, существует, но он не активен по умолчанию.

  • Главный поток: Run Loop запущен всегда для обработки событий UI, жестов, таймеров.
  • Глобальные потоки (GCD): Run Loop создаётся для каждого потока, но находится в остановленном состоянии (runMode:before: вернёт false).

Зачем и как запустить Run Loop на фоновом потоке? Это нужно для работы с источниками ввода (input sources), например, NSTimer (не Timer из GCD) или NSStream в режиме, отличном от главного потока.

DispatchQueue.global().async {
    let runLoop = RunLoop.current
    // Добавляем "пустой" порт, чтобы Run Loop не завершался сразу из-за отсутствия источников
    runLoop.add(Port(), forMode: .default)
    // Запускаем бесконечный цикл обработки
    runLoop.run()
}

Практический совет: В современных приложениях для фоновых задач почти всегда используют GCD (DispatchQueue, DispatchSource) или OperationQueue, так как они эффективнее и проще для параллельных вычислений. Run Loop на фоновых потоках — это специфический кейс.