在我的应用中,我有一个NSTimer和一个选择器- (void)TimerCount
。我也有一个整数int CountNum
,每0.01秒,它增加1(CountNum = CountNum + 1
)。
Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(TimerCount) userInfo:nil repeats:YES];
我希望计时器恢复以为应用已终止或进入后台。我怎么能这样做?
答案 0 :(得分:1)
有几点想法:
一般情况下,你不会试图让计时器继续运行。如果你不需要,你应该避免让应用程序在后台执行任何操作。您不必要地耗尽用户的系统资源(电池,内存,CPU周期等)。
如果您需要在未来的某个时间点引起用户的注意,此时应用可能无法运行(例如,如果这是您正在实施的倒计时或类似警报的功能),请使用location notification而不是使用计时器。
此外,如果您正在尝试跟踪已经过了多长时间,则使用NSTimer
不是正确的解决方案(特别是如果您每秒关闭它100次)。捕获开始时间,然后当您想要确定已经过了多长时间时,那么在任何未来的时间点,您都可以获取当前时间并将其与开始时间进行比较。
这种方法的优点在于您不再关心执行此过程的频率。如果您要更新UI,则可以每秒调用60次。如果应用程序在后台,则在将应用程序带回前台之前不必执行任何操作(只需将开始时间保存在持久存储中,例如NSUserDefaults
,然后在应用程序时再次检索它再次启动。)
最重要的是,通过从“计数器”方法转移到“比较当前时间到开始时间”的方法,您可以将UI与计时器分离。毋庸置疑,一旦你完成了这项工作,当应用程序离开前台时你完全不需要计时器。
如果您绝对需要在应用程序离开前台时运行计时器,那么有办法(例如请求几分钟完成一些有限长度的任务),但只有在您绝对需要时才这样做。如果您只是更新计数器,那么您绝对不希望这样做。
答案 1 :(得分:1)
如果您的应用程序已终止,您将无法继续处理。要在后台运行,有诸如后台任务之类的东西,但听起来你的用例并不能保证它们。由于您的递增是线性且可计算的,因此您可以将开始日期指定为NSUserDefaults
,然后在应用程序恢复时将其加载并更新计数。
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]] forKey:@"start_time"];
NSNumber *start = [[NSUserDefaults standardUserDefaults] objectForKey:@"start_time"];
countNum = ceil([[NSDate date] timeIntervalSince1970] * 100) - ceil([start doubleValue] * 100);
答案 2 :(得分:0)
您可以使用NSuserdefaults保存您的countNum,只要用户退出将保存的应用程序。只需将其调用为APPDELEGATE函数- (void)applicationWillTerminate:(UIApplication *)application {
NSUserDefault *defaults = [NSUser Defaults standardUserDefaults];
[defaults setInteger: countNum forKeys:@"ANY_KEY_HERE"];
[defaults synchronise];
上面的代码会保存你的countNum,但是当用户终止或进入后台时你必须保存它。
当用户进入前台时,您可以拨打电话以恢复您的countNum
NSUserDefault *defaults = [NSUser Defaults standardUserDefaults];
yourCountNum = [default getIntegerForKeys: @"ANY_KEY_HERE"];