Swift 计时器滞后

Swift Timer lags

我知道 Timer 不能保证 运行 完全符合您要求的速度。 但是,我刚刚开始了一个全新的项目:

class ViewController: NSViewController {

    var timer = Timer()
    var count: Double = 0.0
    var timeStamp: Date = Date()

override func viewDidLoad() {
    super.viewDidLoad()
    self.timer = Timer.scheduledTimer(timeInterval: 0.1,
                                      target: self,
                                      selector: #selector(self.updateCounting),
                                      userInfo: nil,
                                      repeats: true)
}

@objc func updateCounting(){
    let duration = self.timeStamp.distance(to: Date())
    print("Counting \(self.count) vs. Real life \(duration)")
    self.count = self.count + 0.1
}

}

我希望在 countduration 之间得到大致相同的结果,但我看到了这样奇怪的事情:

Counting 60.50000000000059 vs. Real life 60.64057409763336
Counting 60.60000000000059 vs. Real life 60.741435050964355
Counting 60.70000000000059 vs. Real life 70.84065008163452
Counting 60.800000000000594 vs. Real life 80.94094407558441
Counting 60.900000000000595 vs. Real life 82.99448704719543

在 Xcode 11.5、iMac 和 MacBook Pro 上测试。 我是不是做错了什么?

没看错,但您错过了 Mac 应用的能效指南

您的应用正在休眠。

检查 ProcessInfo 并搜索 管理活动。一个例子(不好的例子)是将你的 AppDelegate.swift 更改为:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    private var activity: NSObjectProtocol!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let options: ProcessInfo.ActivityOptions = [.userInitiatedAllowingIdleSystemSleep]
        let reason = "No napping!"
        self.activity = ProcessInfo.processInfo.beginActivity(options: options, reason: reason)
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        ProcessInfo.processInfo.endActivity(activity)
    }
}

但是不要这样做,对用户不好,MacBook Pro 电池寿命等