2013-03-09 33 views
0

有人可以在applicationDidEnterBackground中解释执行顺序吗?ios后台任务 - 解释执行顺序?

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了终止后台任务,而不是等待系统默认的过期

具体而言,在我打电话的NSLog

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

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

我也觉得我的理解是不正确......

回答

2

一切有关你们是除了一个重要的细节基本上是正确的。这些与applicationDidEnterBackground应用程序委托方法没有任何关系。

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

这两种方法中包装代码的要点是通知操作系统,即使应用程序恰好在运行时进入后台,您仍需要继续运行某些处理。如果没有这些块,只有在尝试在后台运行几(10?)秒后,操作系统才会杀死您的应用程序。

+0

这很有趣!但dispatch_async必须位于applicationDidEnterBackground内,不是吗?或者任何循环将继续运行? – selytch 2013-03-09 08:06:10

+0

不,dispatch_async(和两个begin/endTask方法)可以在您的应用程序中的任何位置随时调用。整个想法是你保护更长时间的运行代码,以防应用程序进入后台。大多数情况下,应用程序将执行代码,而不会进入后台。唯一一次你将这样的代码放在'applicationDidEnterBackground'里面的时候,你只有当应用程序进入后台时才有一些进程需要运行。关于这个的唯一用途是为了在应用程序在后台终止的情况下做一些最终的数据持久性。 – rmaddy 2013-03-09 16:02:50

+0

还有一件事 - 我需要在expirationHandler中调用[application endBackgroundTask:background_task]吗? – selytch 2013-03-09 19:36:26