RunLoop - это объект-цикл, который функционирует в рамках потока (thread) и на каждом цикле проверяет поступление событий от источников, на которые подписан. Также RunLoop генерирует уведомления об изменении собственного состояния. Можно создать Обсервер, который будет получать данные уведомления. Основная цель RunLoop - нагружать поток работой, когда работа есть, и отправлять в сон, когда задач нет.
RunLoop существует в любом потоке, но по умолчанию активирован только в главном (main thread). В дочерних потоках его необходимо активировать самостоятельно. RunLoop Имеет две реализации
- RunLoop из Foundation (написан на Objective-C)
- CFRunLoop из CoreFoundation (написан на C)
Каждый цикл RunLoop проверяет поступление событий от следующих источников:
- Input - источники асинхронных событий, например сообщения от других потоков или процессов
- Port
- Custom Source
- performSelector
- Timer - таймеры, источники синхронных событий