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

Posted

技术标签:

【中文标题】ios后台任务-解释执行顺序?【英文标题】:ios background tasks - explain sequence of execution? 【发布时间】:2013-03-09 06:32:29 【问题描述】:

有人可以在 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; 
);

我的理解是

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

具体来说,在我调用 NSLog 之后

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

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

我也觉得我的理解不正确……

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这很有趣!但是 dispatch_async 必须在 applicationDidEnterBackground 中,不是吗?或者任何循环都会继续运行? 不,dispatch_async(和两个 begin/endTask 方法)可以在您的应用程序中的任何位置并随时调用。整个想法是保护运行时间更长的代码,以防应用程序进入后台。大多数情况下,应用程序将执行代码而不是进入后台。将此类代码放入applicationDidEnterBackground 中的唯一情况是,只有当应用程序进入后台时才能运行某些进程。这样做的唯一用途是做一些最终的数据持久性,以防应用程序在后台终止。 还有一件事——我需要在 expirationHandler 中调用 [application endBackgroundTask: background_task] 吗?

以上是关于ios后台任务-解释执行顺序?的主要内容,如果未能解决你的问题,请参考以下文章

如何让iOS设备上App定时执行后台任务(下)

如何让iOS设备上App定时执行后台任务(下)

如何在iOS 8中应用程序处于后台状态时连续执行任务

如何让iOS设备上App定时执行后台任务(上)

如何让iOS设备上App定时执行后台任务(上)

iOS:在应用程序处于后台时执行上传任务