背景/前景上的NSTimer行为

时间:2014-01-16 02:45:25

标签: ios iphone objective-c nstimer

情景是:

应用程序具有每5分钟运行一次的主运行循环。当应用程序背景化时,计时器不会失效。

等待一点(比如10分钟)后,前景会立即触发两次。我不清楚这里定义的行为应该是什么(如果有的话),除了在背景上,定时器与应用程序一起暂停/暂停。

在我看来,当应用程序被预设时,计时器实际上会查看自背景以来经过的时间,确定它应该在两者之间触发的次数,并将它们全部触发。我观察到这种情况发生在iOS 7模拟器和iOS 7 iphone上。

Google搜索没有提供有关此主题的更多信息。任何想法/指针?

更新:澄清 - 我的问题是,当应用程序处于后台运行并再次预设时,NSTimer的行为是什么,假设计时器未在后台无效/无效,并且新的计时器不是在前台创建的。

代码示例(代码有点老 - 在ARC之前的日子):

@implementation ReportHandler {
    NSTimer *_reportTimer;
}

- (id)init
{
    if (_reportTimer == nil) {
        _reportTimer = [[NSTimer  timerWithTimeInterval:5*60 target:self selector:@selector(didFireReportTimer:) userInfo:nil repeats:YES] retain];
        [[NSRunLoop mainRunLoop] addTimer:_reportTimer forMode:NSDefaultRunLoopMode];
    }
}

- (void)didFireReportTimer:(NSTimer *)timer {
   // send report over network here, timer is not invalidated here
}

此处或应用程序委托中没有后台/前台处理程序处理此计时器。

1 个答案:

答案 0 :(得分:2)

  

在我看来,当应用程序被预设时,计时器实际上会查看自背景以来经过的时间,确定它应该在两者之间触发的次数,并将它们全部触发。我观察到这种情况发生在iOS 7模拟器和iOS 7 iphone上。

这是对NSTimer和运行循环行为的正确描述。当您的应用程序暂停时,它将不会触发(默认情况下,当您背景时;但如果您启动后台任务,它将在任务运行时正常启动)。