我需要在一定的秒数内每0.1秒调用一次函数。
我试图通过创建两个NSTimers来实现这一目标:
cameraLocalTimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "performStep", userInfo: nil, repeats: true)
cameraGlobalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "captureShouldEnd", userInfo: nil, repeats: false)
然后我实现了他们的功能:
var stepCounter = 0
func performStep() {
stepCounter++
print(stepCounter)
}
func captureShouldEnd() {
cameraGlobalTimer.invalidate()
cameraLocalTimer.invalidate()
stepCounter = 0
}
但是当我运行我的应用程序时,我在日志中看到cameraLocalTimer被调用了47次而不是50次。
有人可以帮我解决问题或建议更好的方法吗?
答案 0 :(得分:1)
如果你想达到这种高精度水平,NSTimer是不够的。根据NSTimer的文件:
计时器不是实时机制;只有当添加了计时器的其中一个运行循环模式正在运行并且能够检查计时器的触发时间是否已经过去时,它才会触发。由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率限制在50-100毫秒的数量级。
这意味着你可能会跳过一个节拍。为了获得更高的精度,我建议您查看CADisplayLink,这是一个较低级别的功能,可以进入屏幕刷新率并为您提供可用于运行计算的时间戳。话虽如此,保真度将始终取决于您的屏幕刷新率。