【发布时间】:2020-06-13 13:10:11
【问题描述】:
我正在用 Swift 编写一个 Mac OS 应用程序,并希望每 0.5 秒重复一次任务(或多或少,不需要高精度)。当我使用其他应用程序时,此应用程序应该在后台运行。
我目前正在使用Timer:
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true)
它开始正常,大约每 0.5 秒更新一次,但在后台运行一段时间后,计时器会大幅减慢到大约 1 秒或 2 秒的间隔(它非常接近这些值,似乎计时器跳过滴答声或有一个2 或 4 倍的减速)。
我怀疑这是因为应用程序在后台几秒钟后被赋予了低优先级。有没有办法避免这种情况?它可以在 XCode 的应用程序设置中通过要求始终保持活动状态,也可以在应用程序运行时从系统中获取(或者甚至在没有 Timer 的情况下以不同的方式做事,但如果可能的话,我宁愿保持简单)。
这是一个最小的工作示例:应用程序只有一个带有此代码的 ViewController
import Cocoa
class ViewController: NSViewController {
var lastUpdate = Date().timeIntervalSince1970
override func viewDidLoad() {
super.viewDidLoad()
let timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) {
timer in
let now = Date().timeIntervalSince1970
print(now - self.lastUpdate)
self.lastUpdate = now
}
RunLoop.current.add(timer, forMode: .common)
}
}
开始时的输出是
0.5277011394500732
0.5008649826049805
0.5000109672546387
0.49898695945739746
0.5005381107330322
0.5005340576171875
0.5000457763671875
...
但在后台几秒钟后它变成了
0.49993896484375
0.49997520446777344
0.5000619888305664
1.5194149017333984
1.0009620189666748
0.9984869956970215
2.0002501010894775
2.001321792602539
1.9989290237426758
...
如果我将应用程序带回前台,计时器将返回 0.5 秒增量。
注意:我在 iMac 上运行 Mac OSX 10.15.5 (Catalina)
【问题讨论】: