Я пытаюсь лучше понять циклы выполнения применительно к приложениям Mac ( NSRunLoop ), но это также может быть более общий вопрос. Документация NSRunLoop гласит:
... ваш код обеспечивает цикл while
или for
, который управляет циклом выполнения. Внутри вашего цикла вы используете объект цикла выполнения для «запуска» кода обработки событий, который получает события и вызывает установленные обработчики.
Документы имеют пример кода, подобный следующему:
BOOL shouldKeepRunning = YES;
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
Таким образом, код продолжает вызывать цикл выполнения, пока не будет решено, что он должен завершиться. Метод -runMode:beforeDate:
«Запускает цикл один раз, блокируя ввод в указанном режиме до указанной даты». И есть также метод -run
, который «переводит приемник в постоянный цикл, в течение которого он обрабатывает данные из всех подключенных входных источников».
Как это возможно, что повторный вызов цикла выполнения (или вызов -run
, который, похоже, сам по себе) не потребляет ЦП? Приложение Какао может бездействовать в фоновом режиме, пока выполняется его основной цикл выполнения, и оно будет использовать нулевое (или почти нулевое) время ЦП.
И в пределах -runMode:beforeDate:
, как может блокировать цикл выполнения до получения ввода или срабатывания таймеров без опроса и загрузки ЦП?