Ios 如何使NSTimer更准确?

Ios 如何使NSTimer更准确?,ios,swift,nstimer,Ios,Swift,Nstimer,在我的应用程序中,我在视图控制器上放置了一个标签,我希望该标签显示一个每毫秒递增1的数字。(我知道我可以每秒更新1000次,但我希望它看起来平滑) 代码对我来说都很合理,但当我运行应用程序时,我发现这个数字是每秒增加50,而不是每秒增加1000。这个错误是不可接受的 令人惊讶的是,当我锁定屏幕几秒钟并再次解锁时,这个数字突然增加了几千 我想这是因为我在定时器启动时更新UI,所以需要更多的时间。但是我该如何解决这个问题呢?你的问题是如何使NSTimer更准确,我有个坏消息:你不能。NSTimer的

在我的应用程序中,我在视图控制器上放置了一个标签,我希望该标签显示一个每毫秒递增1的数字。(我知道我可以每秒更新1000次,但我希望它看起来平滑)

代码对我来说都很合理,但当我运行应用程序时,我发现这个数字是每秒增加50,而不是每秒增加1000。这个错误是不可接受的

令人惊讶的是,当我锁定屏幕几秒钟并再次解锁时,这个数字突然增加了几千


我想这是因为我在定时器启动时更新UI,所以需要更多的时间。但是我该如何解决这个问题呢?

你的问题是如何使
NSTimer
更准确,我有个坏消息:你不能。
NSTimer
的合理预期是每秒可以调用约30次,如果幸运的话,最多可以每秒调用约60次。没关系

从实用的角度考虑这一点:显示器每秒最多只能更新60次,因此没有必要给用户更多的反馈

如果您试图最大限度地利用硬件,并依靠它以尽可能快的速度启动,那么在较旧且速度较慢的硬件上,您将遇到问题,在这些硬件上,它可能每秒只启动约20次。 依靠
NSTimer
的时间间隔将很快给您带来麻烦

由于查找的是毫秒,因此可以设置开始时间,每次调用函数时,请查看自开始时间起的毫秒数,即传输的毫秒数


您当前的方法完成了苹果文档中所说的一切:
number
只是该方法被调用的次数(而不是传输的毫秒数)

基于@Fennelouski的回答,我建议你换成一个非常适合这种任务的。它将在每次屏幕更新时调用您的方法一次(或每2次或每3次调用一次,或调用
frameInterval
属性中的任何内容)。它还有一个
timestamp
变量,您可以使用它来计算经过了多少时间,并相应地更新标签

使用NSTimer的效果最好不过约为1/60秒(即CADisplayLink刷新率)。考虑到大多数监视器的刷新速度都不超过60 fps,每秒50次将非常平滑。1000 fps对于普通计算设备和显示器来说是非常高的。无需每秒显示超过30帧,请将计时器设置为1/30,保存计时器启动的日期,并使用startDate.timeIntervalSinceNow测量经过的时间
@IBOutlet var label: UILabel!
var number = 0
var timer: NSTimer!

override func viewDidLoad() {
    super.viewDidLoad()
    timer = NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector: Selector("addNumber"), userInfo: nil, repeats: true)
}

func addNumber () {
    number++
    label.text = number.description
}

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    timer?.invalidate()
}