Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在应用程序进入后台或被终止时运行计时器_Ios_Objective C_Nstimer_Appdelegate - Fatal编程技术网

Ios 如何在应用程序进入后台或被终止时运行计时器

Ios 如何在应用程序进入后台或被终止时运行计时器,ios,objective-c,nstimer,appdelegate,Ios,Objective C,Nstimer,Appdelegate,在我的应用程序中,我有一个NSTimer,还有一个选择器-(void)timer count。我还有一个整数intcountnum,它每0.01秒增加1(CountNum=CountNum+1) 我想让计时器恢复,因为应用程序已终止或已进入后台。如何操作?用户退出应用程序时,可以使用NSuserdefaults保存countNum。只需将其调用到APPDELEGATE函数-(void)application将终止:(UIApplication*)application{ NSUserDefaul

在我的应用程序中,我有一个
NSTimer
,还有一个选择器
-(void)timer count
。我还有一个整数
intcountnum
,它每0.01秒增加1(
CountNum=CountNum+1


我想让计时器恢复,因为应用程序已终止或已进入后台。如何操作?

用户退出应用程序时,可以使用NSuserdefaults保存countNum。只需将其调用到APPDELEGATE函数
-(void)application将终止:(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"];
有几点想法:

  • 通常情况下,你不会试图让计时器继续运行。如果你不需要,你应该避免让应用程序在后台做任何事情。这样会不必要地耗尽用户的系统资源(电池、内存、CPU周期等)

  • 如果您需要在将来应用程序可能未运行的时间点(例如,如果这是您正在实施的倒计时或类似警报的功能)引起用户的注意,请使用计时器,而不是使用计时器

  • 此外,如果您试图跟踪经过的时间,使用
    NSTimer
    不是正确的解决方案(尤其是如果您每秒触发100次)。捕获开始时间,然后当您想要确定经过了多少时间时,您可以在将来的任何时间点获取当前时间并将其与开始时间进行比较

    这种方法的美妙之处在于,你不再关心执行此过程的频率。如果你正在更新UI,你可以每秒调用60次。如果应用程序位于后台,则在应用程序返回前台之前,你无需执行任何操作(只需将启动时间保存在永久性存储中,例如
    NSUserDefaults
    ,然后在应用程序再次启动时再次检索即可)

    总之,通过从“计数器”方法转移到“比较当前时间与开始时间”方法,您可以将UI与计时器分离。不用说,一旦完成了这一点,当应用程序离开前台时,您根本不需要计时器

  • 如果在应用程序离开前台时,您绝对需要计时器运行,那么有几种方法可以做到这一点(例如,请求几分钟来完成一些有限长度的任务),但只有在您绝对需要的情况下才能这样做。如果您只是更新计数器,那么您肯定不想这样做。

    如果您的应用程序被终止,您将无法继续处理。要在后台操作,有后台任务之类的事情,但听起来您的用例并不能保证它们。因为ur递增是线性且可计算的,您可以将开始日期指定为
    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);
    
    [[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);