Ответ
Да, существует, но он не активен по умолчанию.
- Главный поток: 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 на фоновых потоках — это специфический кейс.