在Apple NSRunLoop的文档中,有一个示例代码演示了在等待其他东西设置标志时暂停执行.
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
我一直在使用它,但在调查性能问题时,我追踪到了这段代码.我使用几乎完全相同的代码(只是标志的名称不同:),如果我在设置标志后的行上加上NSLog
(在另一种方法中),然后在while()
后加上一行,两个日志(log)语句之间似乎会有几秒钟的随机等待.
在速度较慢或较快的机器上,延迟似乎没有什么不同,但在不同的运行中,延迟会有所不同,至少为几秒,最多为10秒.
我已经用下面的代码解决了这个问题,但原始代码不起作用似乎是不对的.
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
使用此代码,设置标志时的日志(log)语句与while循环后的日志(log)语句现在的间隔始终小于0.1秒.
有人知道为什么原始代码会表现出这种行为吗?