Цикл запуску - це абстракція, яка (серед іншого) забезпечує механізм обробки джерел введення системи (сокети, порти, файли, клавіатура, миша, таймери тощо).
Кожен NSThread має свій цикл запуску, до якого можна отримати доступ методом currentRunLoop.
Загалом, вам не потрібно безпосередньо отримувати доступ до циклу запуску, хоча є деякі (мережеві) компоненти, які можуть дозволяти вам вказати, який цикл запуску вони використовуватимуть для обробки вводу / виводу.
Цикл запуску для даного потоку зачекає, поки один або декілька його вхідних джерел отримають деякі дані чи події, а потім запустить відповідний вхідний обробник (и) для обробки кожного вхідного джерела, готового до готовності.
Після цього він повернеться до свого циклу, обробляючи вхід з різних джерел, і "сплячий", якщо роботи немає.
Це досить високий рівень опису (намагаються уникати занадто багато деталей).
EDIT
Спроба звернутися до коментаря. Я розбив його на шматки.
- це означає, що я можу отримати доступ / запустити цикл тільки для запуску циклу всередині потоку?
Справді. NSRunLoop не є безпечним для потоків, і до нього слід звертатися лише з контексту потоку, в якому працює цикл.
- чи є простий приклад, як додати подію до запуску циклу?
Якщо ви хочете контролювати порт, ви просто додасте цей порт до циклу запуску, і тоді цикл запуску буде спостерігати за цим портом за активністю.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Ви також можете явно додати таймер за допомогою
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- що означає, що потім повернеться до своєї петлі?
Цикл запуску обробляє всі готові події кожну ітерацію (відповідно до її режиму). Вам потрібно буде переглянути документацію, щоб дізнатися про режими запуску, оскільки це трохи виходить за межі загальної відповіді.
- чи цикл запуску неактивний, коли я запускаю нитку?
У більшості програм основний цикл запуску запуститься автоматично. Однак ви несете відповідальність за запуск циклу запуску та реагування на вхідні події для потоків, які ви обертаєте.
- чи можна додати деякі події до циклу запуску потоку поза потоком?
Я не впевнений, що ви тут маєте на увазі. Ви не додаєте події до циклу запуску. Ви додаєте вхідні та таймерні джерела (з потоку, що володіє циклом запуску). Потім цикл запуску спостерігає їх за активністю. Ви, звичайно, можете надати введення даних з інших потоків і процесів, але вхід буде оброблений циклом запуску, який контролює ті джерела в потоці, на якому працює цикл запуску.
- чи означає це, що іноді я можу використовувати цикл запуску для блокування потоку на час
Справді. Насправді цикл запуску буде "залишатися" в обробнику події, поки цей обробник подій не повернеться. Ви можете побачити це в будь-якому додатку досить просто. Встановіть обробник для будь-яких дій вводу-виводу (наприклад, натискання кнопок), які сплять. Ви заблокуєте основний цикл запуску (і весь інтерфейс користувача), поки цей метод не завершиться.
Це ж стосується будь-якого циклу запуску.
Я пропоную вам ознайомитися з наступною документацією щодо циклів запуску:
https://developer.apple.com/documentation/foundation/nsrunloop
і як вони використовуються в потоках:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1