Вы можете использовать CFRunLoopRunInMode
для запуска цикла событий за один проход, и он сообщает вам, обрабатывал ли он какие-либо источники. Таким образом, вы можете попробовать что-то вроде этого:
while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, 1) == kCFRunLoopRunHandledSource) {
// nothing
}
Другой подход, который вы можете попробовать, - это создать CFRunLoopObserver
с аргументом activities
, равным kCFRunLoopBeforeWaiting
. Этот наблюдатель будет вызван непосредственно перед тем, как цикл выполнения перейдет в спящий режим в ожидании срабатывания источника или таймера. В вызове наблюдателя вы можете просто позвонить CFRunLoopStop(CFRunLoopGetCurrent())
.