gpt4 book ai didi

objective-c - 防止 NSTimer 在后台应用程序中触发延迟

转载 作者:行者123 更新时间:2023-12-03 17:33:21 26 4
gpt4 key购买 nike

我正在开发一个 macOS 应用程序(我们称之为“显示应用程序”),该应用程序显示时钟和其他数据,该应用程序由同一计算机上的另一个应用程序(“控制应用程序”)通过 TCP 连接进行控制。我注意到,当显示应用程序空闲一段时间(> 60 秒)然后安排 NSTimer(间隔为 0.2 秒)时,在计时器触发之前需要非常很长时间第一次(在 6-10 秒范围内,有时更长。)这种情况主要发生在显示应用程序不是最前面的时候(因为控制应用程序是最前面的。)一旦计时器第一次触发,它就会按预期工作(计时器中会有一些小的、预期的延迟)一段时间。

但是当计时器运行很长时间(超过 5 分钟)时,触发之间也会出现类似的极端延迟(也是 6-10 秒)。看起来像手动调度计时器

[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

稍微推迟问题(使用[NSTimerchedTimer...]使该问题比手动将其添加到运行循环时更快出现。)

这会造成很多麻烦,因为时钟在这段时间内没有更新。

我认为发生这种情况是因为 macOS 以某种方式认为显示应用程序“空闲”或“不活动”。

有办法预防、控制或规避这种行为吗?

最佳答案

这是App Nap 。显示应用可以执行以下操作来避免小睡:

id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityUserInitiatedAllowingIdleSystemSleep reason:@"whatever"];

当它可以再次小睡时,你应该这样做:

[[NSProcessInfo processInfo] endActivity:activity];

关于objective-c - 防止 NSTimer 在后台应用程序中触发延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50512279/

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