我正在开发一个macOS应用程序(我们称之为“显示应用程序”),它显示时钟和其他数据,由同一台计算机上的另一个应用程序(“控制应用程序”)通过TCP连接控制。我注意到当显示应用程序空闲一段时间(> 60秒)然后安排NSTimer(间隔为.2秒)时,在计时器之前需要很长时间非常第一次触发(在6-10秒的范围内,有时更长。)这种情况主要发生在显示应用程序不在最前面(因为控制应用程序是。)一旦计时器第一次触发,它按预期工作(有一些小的,预期的计时器延迟)一段时间。
但是当计时器运行很长时间(超过5分钟)时,触发之间也存在类似的极端延迟(也是6-10秒)。看起来像是手动调度计时器
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
稍微推迟一下这个问题(使用[NSTimer scheduledTimer...]
会使问题出现的时间比手动将其添加到runloop时更早出现。)
这会导致很多麻烦,因为在此期间时钟没有更新。
我认为这是因为macOS以某种方式将显示应用程序视为“空闲”或“非活动”。
有没有办法预防,控制或规避这种行为?
答案 0 :(得分:2)
这是App Nap。显示应用可以执行以下操作以避免小睡:
id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityUserInitiatedAllowingIdleSystemSleep reason:@"whatever"];
当它可以再次打盹时,你应该这样做:
[[NSProcessInfo processInfo] endActivity:activity];