当应用程序进入后台时如何继续运行NSTimer

时间:2013-04-03 14:44:45

标签: iphone ios5 ios6 nstimer

我正在创建益智游戏应用程序,并且我正在使用NSTimer显示时间(即01:20)。当应用程序在后台运行时,NSTimer暂停,但我想继续它甚至应用程序处于后台状态。

例如,当应用程序在后台运行时计时器计数为15秒而我将其置于5秒并且现在变为前景我需要计时器计数更改到20秒

我搜索了很多,但没有得到很好的答案。 所以请建议我如何实现这一目标。

5 个答案:

答案 0 :(得分:3)

不要将计时器视为计时的对象。可以把它想象成一个以给定频率脉冲的物体。要测量时间,请记录开始时间并将其与当前时间进行比较。

要记录开始时间,请将其写入文件,如下所示,可能是在appWillResignActive中:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSString *filename = [path stringByAppendingPathComponent:@"saveme.dat"];

NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self.startDate];
[data writeToFile:filename atomically:NO];
// invalidate timer

当appWillBecomeActive:

NSData *data = [NSData dataWithContentsOfFile:filename];    // using the same code as before
self.startDate = [NSKeyedUnarchiver unarchiveObjectWithData:data];
// start a timer for the purpose of pulsing only

此时的经过时间是:

NSDate *now = [NSDate date];
NSTimeInterval = [now timeIntervalSinceDate:self.startDate];

所有上述内容都可以在不在后台运行的情况下完成。如果您确实需要在后台触发计时器,请参阅此apple ref。在"背景执行"。简而言之,您可以这样做,但Apple会在批准应用程序之前让您满足几个标准 - 就像它必须是有限的并为用户提供实用程序一样。

答案 1 :(得分:1)

您需要将该信息写入文件或缓存退出时的时间。然后,当应用程序恢复时,您将读取该值,进行一些数学计算,然后重新启动计时器。

在AppDelegate中,应用程序将后台保存到文件或NSUserDefaults的时间。您可以调用NSDate的类方法来获取可以轻松存储的Integer值。

+ (NSTimeInterval)timeIntervalSinceReferenceDate

在应用程序恢复时,读入值。获取当前timeIntervalSinceReferenceDate并减去。你应该有经过的秒数。

答案 2 :(得分:1)

在班级中创建一个NSDate ivar来管理开始时间。

@implementation SomeClass {
  NSDate *startTime;
}

对于您的计时器,只需在此日期通过数学计算时间。您的计时器更多地用于调用执行此计算的方法,而不是确定时间本身......

[NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

您方法的逻辑......

- (void)updateTimer {
  if (!startTime) {
    startTime = [NSDate date];
  }
  NSInteger secondsSinceStart = -(NSInteger)[startTime timeIntervalSinceNow];
  NSLog(@"%d", secondsSinceStart);
}

答案 3 :(得分:0)

我建议将开始时间保存为NSDate对象,然后在应用程序运行时每隔一秒NSTimer,通过计算当前时间间隔来更新显示的时间时间和开始时间。当您的应用程序进入后台时暂停计时器(以便在应用程序启动时不会发生大量不必要的火灾),并在应用程序进入前台时重新启动它。

如果您希望在应用程序中完全关闭数据(通过在后台保留太长时间,或在应用程序切换器中关闭),那么您需要在适当的时间将数据保存到磁盘。

答案 4 :(得分:0)

self.timer = [NSTimer scheduledTimerWithTimeInterval:0.5f
                                 target:self
                               selector:@selector(showTime)
                               userInfo:NULL
                                repeats:YES];

- (void)showTime
{
NSDate *now=[NSDate date];
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:@"HH:mm:ss"];
timeLabel.text=[dateFormatter stringFromDate:now];
}

希望这个答案能帮到你......