Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 秒精度_Ios_Swift_Nstimer_Cadisplaylink - Fatal编程技术网

Ios 秒精度

Ios 秒精度,ios,swift,nstimer,cadisplaylink,Ios,Swift,Nstimer,Cadisplaylink,我有一个9位数的数字,需要每秒递增500,但我决定每毫秒递增一次,并更新显示数字的标签。我使用的是NSTimer,但正如我在各地读到的,它们既不准确,也不应该准确。我尝试过使用CFAbsoluteTimeGetCurrent,但无法使其工作。简单地使用NSTimer会产生不准确的值。每次用户打开应用程序时,增量不会停止,它只是将值相加,然后再次开始增量。 有什么想法吗 更新: 尽管大多数答案都指向正确的方向,但我解决的问题却有点不同。感谢所有回答的人和马丁 我使用了CADisplayLink而不

我有一个9位数的数字,需要每秒递增500,但我决定每毫秒递增一次,并更新显示数字的标签。我使用的是
NSTimer
,但正如我在各地读到的,它们既不准确,也不应该准确。我尝试过使用
CFAbsoluteTimeGetCurrent
,但无法使其工作。简单地使用
NSTimer
会产生不准确的值。每次用户打开应用程序时,增量不会停止,它只是将值相加,然后再次开始增量。 有什么想法吗

更新:

尽管大多数答案都指向正确的方向,但我解决的问题却有点不同。感谢所有回答的人和马丁


我使用了
CADisplayLink
而不是
NSTimer
,得到了非常准确和稳定的结果。现在请注意,我之所以说“漂亮”,是因为结果并不完全准确,但在我的例子中,我增加了一个9位数,因此它们并不明显,而且一旦视图再次出现,我的数字就会被更正。

仅将计时器用作更新屏幕的触发器,不要依赖每次开火之间的确切时间


保留一个表示开始时间的
NSDate
,并使用计时器触发时的当前日期来计算差异并更新标签。

仅将计时器用作触发来更新屏幕,不要依赖每次触发之间的确切时间


保留一个表示开始时间的
NSDate
,并在计时器启动时使用当前日期来计算差值并更新标签。

时间不会非常精确-但如果每次进入循环时都获得准确的当前时间并加500 x(整秒数),则不必如此,您将获得每秒增加500的显示(加/减50-100毫秒)

这种方法的优点是,你不会得到一个不断增加的时间差异,只有50-100毫秒


如果您希望在用户退出应用程序时计时器停止,那么当应用程序变为非活动状态时,您需要禁用计时器-请查看Ray Wenderlich网站上的本教程时间不会非常精确-但如果您每次进入循环并添加500 x时都获得准确的当前时间,则无需如此(整秒数),您将获得每秒增加500的显示(加/减50-100毫秒)

这种方法的优点是,你不会得到一个不断增加的时间差异,只有50-100毫秒

如果你想让计时器在用户退出应用程序时停止,那么当应用程序变为非活动状态时,你需要禁用计时器-查看Ray Wenderlich网站上的本教程

考虑使用它来更新你的界面-它提供了自上一帧绘制以来经过的非常准确的时间数,因此你可以始终保持您的
UILabel
最新,无论您的帧速率有多高或多低。

考虑使用更新您的界面-它提供了自上一帧绘制以来经过的非常准确的时间数,因此您可以始终保持您的
UILabel
最新,无论您的帧速率有多高或多低。

您可以获得准确度

timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(countup)userInfo:nil repeats:YES];
你可以得到准确度

timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(countup)userInfo:nil repeats:YES];

当然,如果我想每秒钟更新一次标签,计时器会工作。但我希望每毫秒显示一次标签(类似于秒表的递增方式)。我想每毫秒增加0.5个数量,然后更新标签。好的-没有做到!你仍然可以使用相同的方法-根据需要尽快启动计时器,并使用准确的时间确定要显示的内容。你将无法看到计数器显示每毫秒更新一次-你实际需要多长时间要更新吗?尽可能经常地,坚持屏幕的刷新率就可以了。我一定错过了什么,但是如果我在计时器启动时设置启动时间(应用程序启动),我的运行时间会越来越长,对吧?因此,再加上快速刷新率,我每次运行更新标签的功能时都会有很大的飞跃。我很困惑。当然,如果我想每秒更新标签,计时器会工作。但我需要每毫秒显示一次标签(类似于秒表的增量)。我想每毫秒增加0.5个数量,然后更新标签。好的-没有做到!你仍然可以使用相同的方法-根据需要尽快启动计时器,并使用准确的时间确定要显示的内容。你将无法看到计数器显示每毫秒更新一次-你实际需要多长时间要更新吗?尽可能经常地,坚持屏幕的刷新率就可以了。我一定错过了什么,但是如果我在计时器启动时设置启动时间(应用程序启动),我的运行时间会越来越长,对吧?因此,再加上快速刷新率,每次我运行更新标签的功能时,都会有很大的飞跃。我感到困惑。