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

Bil*_*l L 5 nstimer nsrunloop ios

我知道当你为应用程序提供后台时,计时器会停止运行.但是,当你从后台回来时的行为是什么?计时器是否保持其原始状态fireDate

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

我的理论如下:

  • 一个NSTimer在未来从背景后面会触发计时器,只要你还没有比原先计划更多的错过了预定时间.(在这种情况下,我们将计时器安排为10分钟,只要您在后台进行10-20分钟,它将在重新进入应用程序时触发.)

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

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

gna*_*729 8

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

如果您现在创建一个应该每十分钟触发一次的计时器,它将尝试从现在开始十分钟,20分钟,30分钟等等.如果应用程序变为一分钟之后入睡12分钟后醒来,计时器会立即再次在20分钟时开火,然后(不定时焙烧后十分钟,但原来的时间后20分钟).

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

  • 这反映在 [NSTimer 文档](https://developer.apple.com/documentation/foundation/timer#1667611) 中:“如果计时器计划在特定时间触发,并且此后每 5 秒触发一次,则计划的即使实际触发时间被延迟,触发时间也将始终落在原来的 5 秒时间间隔内。如果触发时间被延迟到超过了一个或多个预定的触发时间,则计时器仅触发一次该时间段;在发射后,计时器将重新安排到未来的下一个预定发射时间。” (2认同)