嘿,我正在开发一个应用程序,其中我必须每 30 秒调用一次 API,所以我为它创建了 NSTimer。
但是当我的应用程序进入后台时,计时器会在 3-4 分钟后停止触发。所以它只能在后台运行 3-4 分钟,但之后就不再运行了。我如何修改我的代码以使计时器不会停止。
这是我的一些代码。
- (IBAction)didTapStart:(id)sender {
NSLog(@"hey i m in the timer ..%@",[NSDate date]);
[objTimer invalidate];
objTimer=nil;
UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
objTimer = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self
selector:@selector(methodFromTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:objTimer forMode:UITrackingRunLoopMode];
}
-(void)methodFromTimer{
[LOG debug:@"ViewController.m ::methodFromTimer " Message:[NSString stringWithFormat:@"hey i m from timer ....%@",[NSDate date] ]];
NSLog(@"hey i m from timer ....%@",[NSDate date]);
}
我什至用以下内容更改了代码:
[[NSRunLoop mainRunLoop] addTimer:objTimer forMode:NSRunLoopCommonModes];
这也行不通。
不要将 UIBackgroundTaskIdentifier 任务创建为本地任务并将其设置为全局任务,如下所示:
Step -1
Step -2
Step -3
Step -4
由于本地范围松散,而全局范围则不然,我创建了一个演示,并使用 1 秒重复计时器运行了一段时间,并且工作顺利。
如果您遇到问题,请告诉我。
I ran again demo and here are logs of it running.
所以它工作正常并且超过3分钟。另外,3 分钟的逻辑是正确的,但随着 uibackgroundtask 启动,所以它不应该让它杀死计时器的这个任务。
编辑部分:-
bgTask = [应用程序 beginBackgroundTaskWithExpirationHandler:^{
[应用程序结束背景任务:bgTask]; //删除此行,只要计时器正在运行,它就会运行,并且当应用程序被终止时,它的所有 vairbles 和作用域都会自动转储。
}];
检查一下并告诉我是否有效。
嘿,我运行你的代码,并且到达了点过期处理程序,但是在释放调试点之后,计时器运行顺利。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)