gpt4 book ai didi

objective-c - 让 NSRunLoop 等待设置标志的最佳方法?

转载 作者:IT老高 更新时间:2023-10-28 11:44:55 28 4
gpt4 key购买 nike

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 秒。

有人知道为什么原始代码会出现这种行为吗?

最佳答案

Runloops 有点像一个神奇的盒子,事情发生的地方。

基本上你是在告诉 runloop 去处理一些事件然后返回。或者如果在超时之前没有处理任何事件,则返回。

使用 0.1 秒超时,您经常会遇到超时。 runloop 触发,不处理任何事件并在 0.1 秒内返回。偶尔它会有机会处理一个事件。

随着您的 distinctFuture 超时,runloop 将永远等待,直到它处理一个事件。所以当它返回给你时,它只是处理了某种事件。

短超时值将比无限超时消耗更多的 CPU,但使用短超时有充分的理由,例如,如果您想终止 runloop 正在运行的进程/线程。您可能需要runloop 会注意到一个标志已经改变,它需要尽快退出。

您可能想与 runloop 观察者一起玩,这样您就可以准确地看到 runloop 正在做什么。

this Apple doc了解更多信息。

关于objective-c - 让 NSRunLoop 等待设置标志的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149646/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com