情景是:
应用程序具有每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
}
此处或应用程序委托中没有后台/前台处理程序处理此计时器。
答案 0 :(得分:2)
在我看来,当应用程序被预设时,计时器实际上会查看自背景以来经过的时间,确定它应该在两者之间触发的次数,并将它们全部触发。我观察到这种情况发生在iOS 7模拟器和iOS 7 iphone上。
这是对NSTimer和运行循环行为的正确描述。当您的应用程序暂停时,它将不会触发(默认情况下,当您背景时;但如果您启动后台任务,它将在任务运行时正常启动)。