使用NSTimer更新MenuBar Mac应用程序的内存有效方式?

时间:2016-07-27 17:44:53

标签: objective-c macos launchd

我正在Objective C中创建一个Mac应用程序,它将在菜单栏中运行并定期执行桌面操作(例如更改壁纸)。我正在创建应用程序,以便它始终保留在菜单栏中,从而可以轻松访问配置选项和其他信息。我主要担心的是如何安排我的应用程序每X分钟运行一次以执行桌面操作。

我见过的最常见的解决方案是使用NSTimer,但是,我担心它不会节省内存(在Apple Developer docs上阅读以下页面之后。使用NSTimer会阻止笔记本电脑进入睡眠状态,并且需要一个始终运行的线程来检查NSTimer何时结束。是否有更节省内存的方式使用NSTimer来安排这些操作?

或者,有没有办法使用LaunchD来启动对我的应用程序(位于菜单栏中)的调用,以便它可以处理事件并执行桌面操作。我认为第二种方式更好,但我不确定它是否可行。

1 个答案:

答案 0 :(得分:0)

首先,保持这种低影响的出色本能。但在这种特殊情况下,你可能会过度担心。

当他们说“将系统从空闲状态唤醒”时,他们并不意味着屏幕变黑的系统级“睡眠”。他们意味着闲置状态。当没有立即需要完成的工作时,CPU可以在几分之一秒内进行微小的小睡。即使系统在技术上“清醒”,这也可以大大降低功率要求。

让很多定时器飞来飞去的问题并不是它们的频率和容差。假设你有一个频率为1秒的10个定时器,但是它们相互偏移了100毫秒(恰好是他们碰巧开始的时间)。这意味着最长的“间隙”是100毫秒。但是如果它们在1秒内配置为0.9秒容差(即在1s和1.9s之间),那么系统可以将它们一起安排在一起,做一堆工作,并且花费大部分第二个空闲时间。这对电力来说要好得多。

要成为一名优秀的计时器公民,您应该首先按照您真正想要工作的间隔设置计时器。如果您的计时器通常会触发,但您所做的只是检查一些情况并重新安排计时器,那么您就是在浪费电力。 (听起来你已经掌握了这一点。)你应该做的第二件事是设定一个合理的容忍度。默认值为0,这是一个非常小的容差(它实际上不是“0容差”,但它与一分钟相比非常小)。对于你的问题,我可能会使用至少1s的容差。

我强烈推荐来自WWDC 2013的Energy Best Practices演讲。您可能也会对2014年以后的Writing Energy Efficient Code次会议和2015年的Achieving All-day Battery Life会议感兴趣。

当然可以使用launchd,但它增加了很多复杂性,特别是在安装时。我不推荐你描述的问题。