关闭应用程序后NSTimer是否运行

时间:2013-05-31 09:38:49

标签: ios objective-c macos

此处代码:

timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(getLastImageName) userInfo:nil repeats:YES];
 runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer1 forMode:NSRunLoopCommonModes];
 [runLoop run];

当用户按错了选项时,此计时器会触发警报。点击警告确定按钮,我停止计时器并runloop。如果用户没有点击确定按钮而是按下iPhone主页按钮,计时器会停止吗?

2 个答案:

答案 0 :(得分:4)

计时器没有"运行"在你思考的方式。没有"倒计时。"计时器只是在运行循环中添加一个标记,以便在特定时间发送某个消息。每次runloop运行时,它会检查是否有任何定时器已过期(如果"现在"是否晚于他们的开火日期)。如果是这样,它以与调用drawRect:之类的其他内容相同的方式发送所请求的消息,或者处理触摸事件等。它或多或少是一个巨大的while (true)循环,其中循环中的一个东西是"火过期的计时器。"

那么所有这些意味着什么呢?这意味着定时器只有在给定的回路被泵送时才会触发" (处理)。通常这是主runloop,它只在您的应用程序处于活动状态时进行处理。如果您变为非活动状态(通常在用户导航到另一个应用程序时),则runloop不会处理。当您回来时,所有在您处于非活动状态时到期的计时器都会触发(这就是为什么您通常希望在进入后台之前使计时器无效的原因)。 (非主要的runloops有点复杂,但非常罕见。但它们仍然无法在后台无限期地运行,但是有更多的情况下它们无法运行。)

另一方面,如果你被终止(这可能会在你背后没有通知的情况下发生),那么你的runloops都会消失。重新启动时,您的计时器不会被实例化。如果你想要它,这就是你的工作。所以你不能依靠你的计时器开火。

由于您已加入repeats:YES,系统会自动为您重新安排计时器。同样,这并不意味着它会倒计时#34;或者是#34;仍在运行"或类似的东西。它只是意味着当它触发时,它会自动安排另一个计时器事件。因此,如果用户只是坐在" OK"按钮足够长,计时器将再次启动(在iOS中;在Mac和"模式"在那里更重要的事情可能会有所不同。)

请注意,没有理由同时调用scheduledTimerWithTimeInterval:...addTimer:..."已预定"方法的一部分意味着计时器已经添加到runloop。

答案 1 :(得分:0)

您的应用是在后台运行还是在后台暂停?

如果您尚未向info.plist添加多任务处理模式,您的应用将被暂停。计时器将暂停,直到用户恢复您的应用程序。

如果您添加了多任务处理模式并且符合要求(例如音频模式,并且您当前正在播放音频),那么您的应用仍会运行,包括其计时器。