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