我正在开发一个macOS应用程序(我们称之为“显示应用程序”),它显示时钟和其他数据,该应用程序由同一台计算机上的另一个应用程序(“控制应用程序”)通过TCP连接控制。我注意到,当显示应用程序空闲了一段时间(> 60秒)。然后调度一个NSTimer (有一个.2第二间隔),它需要很长的时间才能第一次触发定时器(在6-10秒的范围内,有时更长)。这种情况主要发生在显示应用程序不是最前端时(因为控制应用程序是最前面的)。一旦计时器第一次启动,它就会像预期的那样工作(计时器中会有一些小的、预期的延迟)一段时间。
但是,当计时器运行很长时间(超过5分钟)时,在发射之间也会出现类似的极端延迟(也就是6-10秒)。它看起来像手动调度计时器与
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];稍微推迟一些问题(使用[NSTimer scheduledTimer...]比手动将问题添加到运行循环时更快地出现该问题。)
这会造成很多麻烦,因为在这段时间内时钟没有更新。
我认为这是因为macOS在某种程度上认为显示应用程序“空闲”或“不活动”。
是否有预防、控制或规避这种行为的方法?
发布于 2018-05-25 14:30:56
我是App小睡。该显示应用程序可以执行以下操作以避免午睡:
id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityUserInitiatedAllowingIdleSystemSleep reason:@"whatever"];当它允许再次午睡时,您应该这样做:
[[NSProcessInfo processInfo] endActivity:activity];https://stackoverflow.com/questions/50512279
复制相似问题