В документации Apple для NSRunLoop есть пример кода, демонстрирующий приостановление выполнения, ожидая, когда флаг будет установлен другим.
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
Я использую это, и он работает, но при исследовании проблемы с производительностью я отслеживал ее до этой части кода. Я использую почти точно такую же часть кода (просто имя флага отличается:) и если я поставлю NSLog
в строке после того, как флаг будет установлен (в другом методе), а затем строка после while()
существует несколько случайных ожиданий между двумя операторами журнала за несколько секунд.
Задержка, похоже, не отличается на более медленных или более быстрых машинах, но отличается от прогона к запуску как минимум за пару секунд и до 10 секунд.
Я работал над этой проблемой со следующим кодом, но не кажется правильным, что исходный код не работает.
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
используя этот код, операторы журнала при установке флага и после цикла while теперь находятся на расстоянии менее 0,1 секунды.
Любые идеи, почему исходный код демонстрирует такое поведение?