在NSRunLoop的 Apple 文档中,有示例代码演示了在等待其他东西设置标志时暂停执行。
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 秒。
有人知道为什么原始代码会表现出这种行为吗?