Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
Iphone 使用NSTimer调度计时器使任务运行速度比预期快_Iphone_Objective C_Nstimer - Fatal编程技术网

Iphone 使用NSTimer调度计时器使任务运行速度比预期快

Iphone 使用NSTimer调度计时器使任务运行速度比预期快,iphone,objective-c,nstimer,Iphone,Objective C,Nstimer,我在视图中使用NSTimer的功能安排了一个计时器,该计时器将出现如下所示: minutesTimer = nil; minutesTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateScrollViewItems) userInfo:NULL repeats:YES]; 通过这个函数调用,我希望它每分钟调用选择器updateScrollViewItems,但是它没有,它

我在
视图中使用NSTimer的功能安排了一个计时器,该计时器将出现如下所示:

minutesTimer = nil;
minutesTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateScrollViewItems) userInfo:NULL repeats:YES];
通过这个函数调用,我希望它每分钟调用选择器
updateScrollViewItems
,但是它没有,它更新项目的速度比预期的快(大约几秒钟)


这种意外行为的原因是什么?

iPhone有很多东西;然而,这是一个整洁的装置;就像其他任何计算机一样,它不是精密计时器。但是,所讨论的方法似乎采用了NSTimeInterval,即双精度。你可能想把它改成
60.0

iPhone有很多功能;然而,这是一个整洁的装置;就像其他任何计算机一样,它不是精密计时器。但是,所讨论的方法似乎采用了NSTimeInterval,即双精度。您可能希望将其更改为
60.0

这可能不是您看到的问题的直接原因,但我已经发现了一个主要错误

每次在
视图上设置此计时器时,都会出现
,这意味着每当视图出现时,您都会创建一个新的计时器(并泄漏旧的计时器),该计时器将在创建后60秒启动

如果您的视图消失并多次重新出现,那么将有多个计时器以完全随机的间隔触发相同的方法

您需要正确管理计时器。如果您希望它在首次创建视图时启动,并在视图未显示时保持勾选/触发,则需要在
init
viewdiload
期间创建它,然后确保在
dealloc
viewdiload
时停止它

如果希望计时器仅在视图为当前视图时滴答/启动,则需要确保在
viewdide出现
viewdire消失
上正确地停止和启动计时器

此外,正如威廉姆·托特兰在他的回答中所说的那样,不应该依赖NSTimer来确定确切的时间。文件中也说明了这一点:

计时器不是实时机制;仅当添加了计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时,它才会触发。由于典型运行循环管理的各种输入源,计时器的时间间隔的有效分辨率限制在50-100毫秒左右。如果计时器的触发时间发生在运行循环处于不监视计时器的模式或长调用期间,则计时器直到下次运行循环检查计时器时才会触发。因此,计时器潜在触发的实际时间可能是计划触发时间之后的一段重要时间


在这种情况下,时间跨度为60秒,计时器不准确应该不是问题,我认为您看到的问题是因为计时器管理不当。

这可能不是您看到的问题的直接原因,但我已经发现了一个主要错误

每次在
视图上设置此计时器时,都会出现
,这意味着每当视图出现时,您都会创建一个新的计时器(并泄漏旧的计时器),该计时器将在创建后60秒启动

如果您的视图消失并多次重新出现,那么将有多个计时器以完全随机的间隔触发相同的方法

您需要正确管理计时器。如果您希望它在首次创建视图时启动,并在视图未显示时保持勾选/触发,则需要在
init
viewdiload
期间创建它,然后确保在
dealloc
viewdiload
时停止它

如果希望计时器仅在视图为当前视图时滴答/启动,则需要确保在
viewdide出现
viewdire消失
上正确地停止和启动计时器

此外,正如威廉姆·托特兰在他的回答中所说的那样,不应该依赖NSTimer来确定确切的时间。文件中也说明了这一点:

计时器不是实时机制;仅当添加了计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时,它才会触发。由于典型运行循环管理的各种输入源,计时器的时间间隔的有效分辨率限制在50-100毫秒左右。如果计时器的触发时间发生在运行循环处于不监视计时器的模式或长调用期间,则计时器直到下次运行循环检查计时器时才会触发。因此,计时器潜在触发的实际时间可能是计划触发时间之后的一段重要时间

在这种情况下,时间跨度为60秒,计时器不精确应该不是问题,我认为您看到的问题是因为计时器没有得到正确管理

如果你只想让你的计时器 当视图为当前视图时,勾选/激发 视图,然后您需要确保 管理停止和启动 在ViewDid上显示相应的计时器 而这一切都将消失

感谢这些信息,尽管我不是这篇文章的作者,但我一直在寻找类似问题的答案。我搔了几天的头,在互联网上到处搜索,但我找不到答案。最后我找到了这根线。这对我来说是一个有价值的信息

如果你只想让你的计时器 当视图为当前视图时,勾选/激发 视图,然后您需要确保 管理停止和启动 在ViewDid上显示相应的计时器 而这一切都将消失

感谢这些信息,尽管我不是这篇文章的作者,但我一直在寻找类似问题的答案。我搔了几个脑袋