在Swift中禁用app nap

时间:2014-12-26 07:05:13

标签: xcode macos swift

如何在Swift中禁用app nap?我是编程的新手,我正在建立一个计时器(仅用于练习),我担心打盹会打破我的计时器。

4 个答案:

答案 0 :(得分:6)

我发现this solution也适用于Swift。

创建一个类或全局变量

var activity: NSObjectProtocol?

然后分配它,之后将禁用App Nap

activity = NSProcessInfo().beginActivityWithOptions(NSActivityOptions.UserInitiated, reason: "Good Reason")

答案 1 :(得分:6)

Swift 3

var activity: NSObjectProtocol?

activity = ProcessInfo().beginActivity(options: ProcessInfo.ActivityOptions.userInitiated, reason: "Good Reason")

答案 2 :(得分:1)

快捷键4

对于ProcessInfo.ActivityOptions,Apple的文档描述了:

  

static var userInitiated

     

标记,指示应用程序正在执行用户请求的操作。

     

static var userInitiatedAllowingIdleSystemSleep

     

标记,表明应用程序正在执行用户请求的操作,但系统可以在空闲时进入睡眠状态。

除非您打算防止系统休眠,否则应使用userInitiatedAllowingIdleSystemSleep

步骤

  1. 将引用保留在一个范围内,该范围将一直保留到您可能要还原更改的任何点为止(例如:在AppDelegate之内)

    var activity: NSObjectProtocol?
    
  2. 可能在AppDelegate applicationDidFinishLaunching中运行此程序:

    activity = ProcessInfo().beginActivity(options: .userInitiatedAllowingIdleSystemSleep, reason: "Good Reason")
    

要随时取消并重新启用App Nap:

if let pinfo = activity {
    ProcessInfo().endActivity(pinfo)
}

答案 3 :(得分:0)

此问题的前 3 个答案均未正确使用 ProcessInfo 类。根据 ProcessInfo documentation

<块引用>

每个进程都有一个共享的 ProcessInfo 对象,称为进程信息代理processInfo 类型属性 [以前的类方法] 返回当前进程的共享代理。

processInfo documentation 进一步解释:

<块引用>

该对象在第一次调用此属性 [以前的方法] 时创建,并且在每次后续调用时都返回相同的对象。

否则,您在开始和结束活动时会引用 ProcessInfo 对象的不同实例(您必须结束活动),这会导致不正确的行为。因此 Swift 5 中的正确代码是:

let activity = ProcessInfo.processInfo.beginActivity(options: .userInitiatedAllowingIdleSystemSleep, reason: "Timer")
// Perform some work
ProcessInfo.processInfo.endActivity(activity)

虽然应用和计时器实现的细节未知,但很难说这种方法在您的情况下是否正确。还请考虑以下注意事项:

<块引用>

如果您的活动在主线程上的事件回调中同步发生,则不需要使用此 API。

请注意,长时间未能结束这些活动可能会对用户计算机的性能产生重大负面影响,因此请确保仅使用所需的最短时间。用户偏好可能会覆盖您应用的请求。

使用 Timer 对象(并在可能的情况下引入一些容差)可能是更正确的方法。系统(及其 App Nap 功能)应考虑计时器。测试和活动监视器会告诉您。