ios后台任务 - 解释执行顺序?

时间:2013-03-09 06:32:30

标签: ios background objective-c-blocks

有人可以在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. 调度异步方法,输出NSLog。在此期间,可以使用该应用程序的所有其他方法
  3. NSLog out后立即终止后台任务,而不是等待系统默认过期
  4. 具体来说,我打电话给NSLog后

    [application endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
    

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

    我也认为我的理解不正确......

1 个答案:

答案 0 :(得分:2)

除了一个重要细节外,关于你帖子的一切基本上都是正确的。这些都与applicationDidEnterBackground app delegate方法无关。

应用中可能需要几秒钟的任何任务都应包含在对beginBackgroundTaskWithExpirationHandlerendBackgroundTask的调用中。

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