当应用程序背景时,NSTimer的行为是什么?

时间:2016-05-13 16:57:25

标签: ios nstimer nsrunloop

我知道当你为app设置后台时,计时器会停止运行。但是,当你从后台回来时的行为是什么?计时器是否保持原来的fireDate

我遇到了一个问题,即从背景中返回时,NSTimer设置为在十分钟内启动,有时我会在applicationWillEnterForeground:为偶然之前立即启动计时器调用。如果它没有触发,并且applicationWillEnterForeground:被调用,我有一些逻辑可以通过将计时器的fireDate与当前日期进行比较来检查是否已经过了10分钟,但是,即使已经过了10分钟,从现在的日期开始,它似乎总是给我一个大约525秒的值。

我的理论如下:

  • 只要您没有错过预定时间超过原定时间,NSTimer将从后台返回时启动计时器。 (在这种情况下,我们将计时器安排为10分钟,只要您在后台进行10-20分钟,它就会在重新进入应用程序时触发。)

  • 如果超过该值,则不会触发,而是在您将来返回的同一时间段内安排另一个计时器。 (AKA如果您使用10分钟的计时器已经在后台工作了20多分钟,那么当您返回时,它会在您返回应用程序之后将计时器安排在未来10分钟。)

有没有人有关于此行为的任何文档?我的理论完全基于观察,关于当背景缺乏或者我无法找到它时会发生什么的文档。

2 个答案:

答案 0 :(得分:8)

您正确观察了NSTimer的行为方式。

如果您现在创建一个应该每十分钟触发一次的计时器,它将尝试从现在开始十分钟,20分钟,30分钟等等。如果应用程序在一分钟后进入睡眠状态并在12分钟后唤醒,则计时器将立即启动,然后再在20分钟(定时器启动后10分钟,但在原始时间后20分钟)再次启动。

但是如果计时器完全错过一个事件然后下一个计时器事件也迟到,比如你在29分钟后醒来,那么10分钟的事件就会被取消,20分钟的事件会尽快被解雇(29分钟后),30分钟后30分钟的比赛被解雇。

答案 1 :(得分:0)

您无法使用计时器来解决此问题。以下是我在调查类似问题后发现的内容:

  • 应用程序在后台运行约30秒后,计时器停止。
  • 当您从后台重新进入时,计时器开始重新开火。

您可以采取哪些措施来克服此问题并正确添加此功能,您必须在后端服务器上实施计时器。在计时器启动时启动服务,并在应用程序处于前台时启动计时器。计时器将自行处理,但当应用程序终止或在后台时,服务器将进入游戏。点击服务以获取已用完的时间或在10分钟过后发送推送通知。