首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSTimer在一段时间后停止在后台触发

NSTimer在一段时间后停止在后台触发
EN

Stack Overflow用户
提问于 2014-09-04 13:45:10
回答 4查看 8.7K关注 0票数 4

嘿,我正在开发一个应用程序,在其中我必须每30秒进行一次API调用,所以我为它创建了NSTimer。但是当我的应用程序进入后台时,计时器在3-4分钟后停止触发。所以它只能在后台工作3-4分钟,但在那之后就不能工作了。如何修改我的代码使计时器不会停止。

下面是我的一些代码。

代码语言:javascript
运行
复制
- (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]);
}

我甚至用下面的代码修改了代码:

代码语言:javascript
运行
复制
[[NSRunLoop mainRunLoop] addTimer:objTimer forMode:NSRunLoopCommonModes];

这也不管用。

EN

回答 4

Stack Overflow用户

发布于 2014-09-04 14:21:27

不要将UIBackgroundTaskIdentifier任务创建为本地任务,将其设置为全局任务,如下所示:

第1步

第2步

第3步

第4步

因为局部的松散作用域和全局的松散作用域,我创建了一个演示,并用1秒的重复计时器运行了一段时间,并且工作得很顺利。不过,如果你遇到问题,请让我知道。

我又运行了一次demo,下面是它运行的日志。

所以它工作得很好,超过了3分钟。同样,3分钟的逻辑是正确的,但由于uibackgroundtask任务是启动的,所以它不应该让它杀死计时器的这个任务。

编辑的部分:- bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ app endBackgroundTask:bgTask;//删除此行,只要计时器正在运行,它就会运行,当应用被终止时,它的所有变量和作用域都会自动转储。}];

检查一下,让我知道它是否有效。

嘿,我运行你的代码,我到达了expirationHandler,但在释放调试点之后,计时器运行得很顺利。

票数 8
EN

Stack Overflow用户

发布于 2014-09-04 13:57:59

不,不要使用NSTimer执行后台任务。它不会像你预期的那样工作。您应该只使用Apple提供的后台获取API。您可以在该API中设置您想要的调用时长。虽然通常不建议设置您想要进行的呼叫的持续时间。看一下这个apple background programming documentation

此外,为了让您快速入门,您可以使用以下Appcoda tutorial

票数 2
EN

Stack Overflow用户

发布于 2014-09-04 14:31:11

这是正常的行为。

在iOS7之后,你只有3分钟的后台时间。如果我没记错的话,在那之前有10分钟。为了扩展这一点,你的应用需要使用一些特殊的服务,如位置,音频或蓝牙,这将使它在后台保持“活力”。

此外,即使您使用这些服务之一,也必须在您的设备上为应用程序启用“后台应用程序刷新”设置。

有关详细信息,请参阅this answer或文档的后台执行部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25658064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档