Цикл выполнения (run loop) — это основной цикл обработки событий в приложении. Он позволяет планировать работу и координировать входящие события (от пользователей, сети, таймеров и т.д.) в определенном потоке.
Ключевые концепции:
- Потоки (Threads): У каждого потока есть свой run loop, но он не запускается автоматически, кроме главного потока приложения.
- Источники входных данных (Input Sources): Генерируют события. Бывают Port-based (системные события) и Custom (пользовательские события).
- Таймеры (Timers): Генерируют события в определенное время или через определенные интервалы.
- Наблюдатели (Observers / Callbacks): Позволяют получать уведомления о различных событиях в жизненном цикле run loop'а.
- Режимы (Modes): Определяют, какие источники входных данных и таймеры будут отслеживаться run loop'ом в данный момент. Наиболее часто используются:
defaultMode: Основной режим.
trackingMode: Используется при прокрутке UIViews или других активностях, требующих приоритета над регулярными событиями.
Как работает:
Run loop переходит в "спящий" режим, когда нет pending-событий, и просыпается, когда их источники становятся активными. Затем он обрабатывает события и может снова "заснуть", если нет дальнейшей работы.
Пример запуска run loop для вторичного потока:
swift
Пример запуска run loop для определенного периода времени:
swift
Основные функции:
- Прием и обработка событий.
- Выполнение отложенной работы.
- Координация работы нескольких потоков.
- Сохранение энергии (без активного polling'а событий).