在我的应用程序中,我在视图控制器上放了一个标签,我希望该标签显示一个每毫秒递增1的数字。 (我知道我可以每秒更新1000,但我希望它看起来很流畅)
{{1}}
代码对我来说都很合理,但是当我运行应用程序时,我发现这个数字每秒增加约50,而不是每秒增加1000。这个错误远远不能接受!
令人惊讶的是,当我锁定屏幕几秒钟并再次解锁时,数字突然增加了几千个!
我认为这是因为我在计时器触发时更新了UI,因此需要更多时间。但我该如何解决这个问题呢?
答案 0 :(得分:5)
您的问题是如何让NSTimer
更准确,我有一些坏消息:您不能。 NSTimer
的合理期望是它可以被称为每秒30次,如果你很幸运,每秒最多可以被召唤约60次。那没关系。
从实际角度考虑这个问题:显示器每秒最多只能更新60次,因此不需要更频繁地提供用户反馈。
如果你试图最大限度地利用硬件并尽可能快地依赖它,那么你就会在较旧和较慢的硬件上遇到问题,它可能每秒只会发射~20次。
依靠NSTimer
的时间间隔会让您快速陷入困境。
由于您要查找毫秒数,因此您可以设置开始时间,每次调用函数时都会查看自开始时间以来的毫秒数以及发送的毫秒数。
您当前的方法可以完成Apple的文档所说的一切:number
只是调用方法的次数(而不是发送的毫秒数)。
答案 1 :(得分:3)
在@ Fennelouski的答案的基础上,我建议你换成CADisplayLink,这是为这种任务而做的。它将在每次屏幕更新时调用您的方法(或者每隔2或3次调用一次,或者您创建frameInterval
属性的任何内容)。它还有一个timestamp
变量,您可以使用它来计算已经过了多少时间并相应地更新您的标签