0

有人可以在 applicationDidEnterBackground 中解释执行顺序吗?

UIBackgroundTaskIdentifier background_task;
background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {

    [application endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"\n\nRunning in the background!\n\n");
    [application endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
});

我的理解是

  1. 为后台任务创建标识符并分配将在时间(10 分钟左右)到期时调用的块
  2. dispatch async 方法,输出 NSLog。在此期间,可以使用应用程序的所有其他方法
  3. NSLog out 后立即终止后台任务,不等待系统默认过期

具体来说,在我调用 NSLog

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

任务将被终止,expirationHandler 块将不会被调用。

我也觉得我的理解有误...

4

1 回答 1

2

除了一个重要细节外,关于您的帖子的所有内容基本上都是正确的。applicationDidEnterBackground这些都与应用程序委托方法无关。

应用程序中任何可能需要几秒钟以上的任务都应该包含在对 and 的调用beginBackgroundTaskWithExpirationHandlerendBackgroundTask

在这两种方法中包装代码的全部目的是通知操作系统您有一些需要继续运行的处理,即使应用程序在运行时碰巧进入后台也是如此。如果没有这些块,您的应用程序将在尝试在后台运行几(10?)秒后被操作系统杀死。

于 2013-03-09T06:38:57.870 回答