如何在Swift中禁用应用程序nap?我是新手程序员,正在构建一个计时器(仅供练习),我担心应用程序nap会破坏我的计时器。
如何在Swift中禁用应用程序nap?我是新手程序员,正在构建一个计时器(仅供练习),我担心应用程序nap会破坏我的计时器。
var activity: NSObjectProtocol?
然后分配它,之后App Nap将被禁用。
activity = NSProcessInfo().beginActivityWithOptions(NSActivityOptions.UserInitiated, reason: "Good Reason")
Swift 4.x / 5.3:
关于 ProcessInfo.ActivityOptions
,苹果文档描述如下:
static var userInitiated
标记表示应用正在执行用户请求的操作。
static var userInitiatedAllowingIdleSystemSleep
标记表示应用正在执行用户请求的操作,但系统可以在空闲时休眠。
除非你的意图是防止系统休眠,否则应该使用 userInitiatedAllowingIdleSystemSleep
。
步骤
Retain reference in a scope that will survive until any point you may want to revert the change (ie: within AppDelegate
)
var activity: NSObjectProtocol?
Run this, possibly in AppDelegate applicationDidFinishLaunching
:
activity = ProcessInfo.processInfo.beginActivity(options: .userInitiatedAllowingIdleSystemSleep, reason: "Good Reason")
随时取消或重新启用App Nap的方法:
if let pinfo = activity {
ProcessInfo.processInfo.endActivity(pinfo)
}
Swift 3:
var activity: NSObjectProtocol?
并且
activity = ProcessInfo().beginActivity(options: ProcessInfo.ActivityOptions.userInitiated, reason: "Good Reason")
之前的三个回答都没有正确使用 ProcessInfo
类。根据 ProcessInfo
文档:
每个进程都有一个单一的、共享的
ProcessInfo
对象,称为进程信息代理。processInfo
类型属性 [以前是类方法] 返回当前进程的共享代理。
processInfo
文档 进一步解释了它:
该对象在第一次调用此属性 [以前是方法] 时创建,并在每次后续调用时返回相同的对象。
否则,在开始和结束活动时引用不同的 ProcessInfo
对象实例(必须结束活动),这可能会导致不正确的行为。因此,在 Swift 5 中正确的代码是:
let activity = ProcessInfo.processInfo.beginActivity(options: .userInitiatedAllowingIdleSystemSleep, reason: "Timer")
// Perform some work
ProcessInfo.processInfo.endActivity(activity)
虽然应用程序和计时器实现的细节不明确,但很难说这种方法在您的情况下是否正确。请还要考虑以下注意事项:
如果您的活动在主线程上的事件回调中同步进行,则无需使用此API。
请注意,长时间未结束这些活动可能会对用户计算机的性能产生重大负面影响,因此请确保仅使用所需的最短时间。用户偏好可能会覆盖您的应用程序请求。
使用Timer
对象(并尽可能引入一些容错性)可能是更正确的方法。系统(及其App Nap功能)应该考虑计时器。测试和活动监视器将为您提供信息。