2

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

例如,当应用程序进入后台时,定时器计数为 15 秒,我将其放置 5 秒并进入前台,现在我需要将定时器计数更改为 20 秒

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

4

5 回答 5

4

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

要记录开始时间,将其写入文件如下,可能在 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 会在批准应用程序之前让你满足几个标准——比如它必须是有限的并为用户提供实用程序。

于 2013-04-03T14:55:19.647 回答
1

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

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

+ (NSTimeInterval)timeIntervalSinceReferenceDate

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

于 2013-04-03T14:48:02.140 回答
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);
}
于 2013-04-03T14:56:28.713 回答
0

我建议将开始时间保存为一个NSDate对象,然后NSTimer在应用程序运行时每秒通过计算当前时间和开始时间之间的时间间隔来更新显示的时间。当你的应用程序进入后台时暂停计时器(这样当你的应用程序重新启动时你不会得到很多不必要的火灾)并在应用程序进入前台时重新启动它。

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

于 2013-04-03T14:53:51.643 回答
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];
}

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

于 2013-04-04T04:31:47.343 回答