如何运行计时器认为应用程序进入后台或终止

时间:2014-10-16 12:57:38

标签: ios xcode nstimer appdelegate

在我的应用中,我有一个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];

我希望计时器恢复以为应用已终止或进入后台。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 一般情况下,你不会试图让计时器继续运行。如果你不需要,你应该避免让应用程序在后台执行任何操作。您不必要地耗尽用户的系统资源(电池,内存,CPU周期等)。

  2. 如果您需要在未来的某个时间点引起用户的注意,此时应用可能无法运行(例如,如果这是您正在实施的倒计时或类似警报的功能),请使用location notification而不是使用计时器。

  3. 此外,如果您正在尝试跟踪已经过了多长时间,则使用NSTimer不是正确的解决方案(特别是如果您每秒关闭它100次)。捕获开始时间,然后当您想要确定已经过了多长时间时,那么在任何未来的时间点,您都可以获取当前时间并将其与开始时间进行比较。

    这种方法的优点在于您不再关心执行此过程的频率。如果您要更新UI,则可以每秒调用60次。如果应用程序在后台,则在将应用程序带回前台之前不必执行任何操作(只需将开始时间保存在持久存储中,例如NSUserDefaults,然后在应用程序时再次检索它再次启动。)

    最重要的是,通过从“计数器”方法转移到“比较当前时间到开始时间”的方法,您可以将UI与计时器分离。毋庸置疑,一旦你完成了这项工作,当应用程序离开前台时你完全不需要计时器。

  4. 如果您绝对需要在应用程序离开前台时运行计时器,那么有办法(例如请求几分钟完成一些有限长度的任务),但只有在您绝对需要时才这样做。如果您只是更新计数器,那么您绝对不希望这样做。

答案 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"];