在IOS上,為了節(jié)能朱嘴,在程序進(jìn)入后臺(tái)后會(huì)被殺掉倾鲫,在OS X上也有類似的機(jī)制,稱為App Nap萍嬉。提供了3個(gè)API以便你來(lái)使用乌昔。
第一個(gè)用來(lái)檢測(cè)你的程序處于何種狀態(tài),這個(gè)方法會(huì)在應(yīng)用程序的可見性發(fā)生改變時(shí)被調(diào)用帚湘。寫在AppDelegate里玫荣。
func applicationDidChangeOcclusionState(notification: NSNotification) {
if NSApp.occlusionState.rawValue == 8194 {
print("foreground")
} else {
print("background")
}
}
第二個(gè)用來(lái)設(shè)置計(jì)時(shí)器容忍度,這個(gè)還不太明白大诸。捅厂。。貌似是說(shuō)在各個(gè)應(yīng)用內(nèi)正在運(yùn)行的計(jì)時(shí)器之間會(huì)有偏差资柔,如果系統(tǒng)實(shí)時(shí)的矯正它們就會(huì)使CPU不停的處于繁忙的狀態(tài)焙贷。設(shè)置計(jì)時(shí)器容忍度可以在差值達(dá)到一定程度后再進(jìn)行矯正。蘋果建議的值是10%贿堰。在啟動(dòng)計(jì)時(shí)器前設(shè)置下setTolerance就可以了辙芍。
第三個(gè)用來(lái)告訴系統(tǒng)你正在做的事是否重要,系統(tǒng)通過這個(gè)來(lái)判斷是否可以進(jìn)入小睡狀態(tài)羹与。
let queue = NSOperationQueue.mainQueue()
var token = NSProcessInfo.processInfo()
token.beginActivityWithOptions(NSActivityOptions.UserInitiated, reason: "can't be interapt")
queue.addOperationWithBlock { () -> Void in
//做一些重要的事故硅,在做這些事時(shí)App不會(huì)進(jìn)入nap模式
}
NSProcessInfo.processInfo().endActivity(token)
token = NSProcessInfo.processInfo()
token.beginActivityWithOptions(NSActivityOptions.Background, reason: "not important")
queue.addOperationWithBlock { () -> Void in
//這里做的事在app不可見時(shí)很可能被打斷
}
NSProcessInfo.processInfo().endActivity(token)