我正在创建益智游戏应用程序,并且我正在使用NSTimer显示时间(即01:20)。当应用程序在后台运行时,NSTimer暂停,但我想继续它甚至应用程序处于后台状态。
例如,当应用程序在后台运行时计时器计数为15秒而我将其置于5秒并且现在变为前景我需要计时器计数更改到20秒
我搜索了很多,但没有得到很好的答案。 所以请建议我如何实现这一目标。
答案 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];
}
希望这个答案能帮到你......