В документации 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 секунды.
У кого-нибудь есть идеи, почему оригинальный код демонстрирует такое поведение?