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
}
}
我希望在 count
和 duration
之间得到大致相同的结果,但我看到了这样奇怪的事情:
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 电池寿命等
我知道 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
}
}
我希望在 count
和 duration
之间得到大致相同的结果,但我看到了这样奇怪的事情:
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 电池寿命等