Ответ
Когда у RunLoop (цикла событий) потока нет готовых к обработке источников (sources), таймеров (timers) или наблюдателей (observers), он переходит в режим сна.
Механизм работы:
- RunLoop завершает текущую итерацию.
- Поток, на котором работает RunLoop, приостанавливается ядром ОС.
- Это приводит к нулевому или минимальному использованию CPU, экономя заряд батареи.
- RunLoop «просыпается» автоматически при появлении нового события (например, сетевого пакета, срабатывания таймера, ручного пробуждения) или по истечении заданного таймаута.
Пример с таймаутом:
let runLoop = RunLoop.current
let deadline = Date(timeIntervalSinceNow: 5.0) // Таймаут 5 секунд
// RunLoop будет работать до дедлайна, но уснет, если не будет событий.
runLoop.run(until: deadline)
Особенности для разных потоков:
- Главный поток (Main Thread): Его RunLoop (
RunLoop.main) работает всегда, так как постоянно получает события от системы (касания, обновления UI, таймеры). Он никогда не завершается. - Фоновые потоки: RunLoop фонового потока по умолчанию не запущен. Если вы запустите его (например, для обработки сетевых сокетов), он может завершиться (
runметод вернет управление), когда все источники событий будут удалены, и поток завершит выполнение.