设备锁定时后台任务停止?

时间:2015-05-15 15:33:50

标签: ios nstimer appdelegate ios8.3

当设备进入后台时,我有一个计时器正在运行,因为我想要检查我服务中的少量数据。我在app delegate

中的applicationDidEnterBackground方法中使用以下代码
    UIApplication *app = [UIApplication sharedApplication];

//create new uiBackgroundTask
__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

//and create new timer with async call:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //run function methodRunAfterBackground
    NSString *server = [variableStore sharedGlobalData].server;
    NSLog(@"%@",server);
    if([server isEqual:@"_DEV"]){
        arrivalsTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(getArrivals) userInfo:nil repeats:YES];
    }
    else {
        arrivalsTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(getArrivals) userInfo:nil repeats:YES];
    }
    [[NSRunLoop currentRunLoop] addTimer:arrivalsTimer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
});

这非常正常,直到设备自动锁定然后计时器停止滴答。有关如何阻止这种情况发生的任何建议?默认的实时时间是5分钟,因此大多数设备将在此偶数之前锁定一次。

由于

1 个答案:

答案 0 :(得分:3)

有几点意见:

  1. 正如H先生指出的那样,beginBackgroundTaskWithExpirationHandler只能在当代iOS版本中给你三分钟(180秒)。因此,尝试在五分钟内启动计时器将无法正常工作。

    您可以使用[[UIApplication sharedApplication] backgroundTimeRemaining]查询您还剩多少时间。

  2. 当设备锁定时,后台任务将继续。您不应该看到该应用程序终止。如果用户通过"双击主页按钮并在任务切换器屏幕上向上滑动"手动终止应用程序,这将终止后台任务,但不是简单地锁定设备。

  3. 关于计时器的一些评论:

    • 代码正在向后台队列添加计时器。这通常不是必需的。仅仅因为应用程序处于后台状态,您仍然可以继续使用主运行循环作为计时器等。

      所以,只需从主线程中调用scheduledTimerWithTimeInterval即可完成。除非绝对必要,否则将GCD工作线程与运行循环一起使用是没有意义的(即使这样,我也可以创建自己的线程并为其添加一个运行循环)。

      顺便说一下,如果在一些后台调度队列上安排计时器是绝对必要的,那么可能更容易使用调度计时器。它完全消除了运行循环要求。

    • 顺便说一句,将scheduledTimerWithTimeIntervaladdTimer一起使用是不合适的。您调用scheduledTimerWithTimeInterval来创建计时器并将其添加到当前运行循环中。如果要将其添加到另一个运行循环,则使用timerWithTimeInterval然后调用addTimer