当应用程序转入后台时,可以请求额外的时间,来完成重要的一分钟任务。请求后台执行时间,可以调用UIApplication类的beginBackgroundTaskWithExpirationHandler: 方法,这个方法延迟你的应用程序挂起的时间。这可能是重要的,若执行一些重要任务,如将用户数据保存至磁盘或从服务器下载重要的文件。
beginBackgroundTaskWithExpirationHandler:方法的使用方式是在你需要保护的任务开始执行之前被调用。每次调用beginBackgroundTaskWithExpirationHandler:方法,必须调用相应的endBackgroundTask:方法来标致任务结束,来保持平衡。因为应用程序仅有有限的时间来结束后台任务,所以你必须在过期前调用该方法,否则系统将终止的应用。为了避免这种情况,你可以提供一个过期的处理(你可以使用UIApplication类的 backgroundTimeRemaining 属性去看还剩余多少时间)。
重要:应用程序可以同时运行任意数量的任务。每次你开始一个后台任务,方法beginBackgroundTaskWithExpirationHandler:返回一个对那个任务的唯一标识。你必须将相同的标识传入endBackgroundTask:方法中,当那个任务结束的时候。
下面的代码展示了当你应用进入后台时,如何启动一个后台任务其中包含一个对于耗时太长任务的过期处理。这个任务将自己提交到分发队列进行异步执行,因此applicationDidEnterBackground:方法可以正常返回.运用blocks减少对重要变量引用管理的代码,如后台任务标识。变量bgTask是这个类的成员变量,用于存放当前后台任务标识的指针并且在该这个方法之前进行了初始化。
代码 在退出时,启动一个后台任务
- (void)applicationDidEnterBackground:(UIApplication *)application |
{ |
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ |
// Clean up any unfinished task business by marking where you |
// stopped or ending the task outright. //通过标记您停止或结束任务,彻底清理任何未完成的业务任务。 |
[application endBackgroundTask:bgTask]; |
bgTask = UIBackgroundTaskInvalid; |
}]; |
|
// Start the long-running task and return immediately. //开始的长时间运行的任务,并立即返回 |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ |
|
// Do the work associated with the task, preferably in chunks. |
// 做与任务相关联的工作,最好是在一块 |
[application endBackgroundTask:bgTask]; |
bgTask = UIBackgroundTaskInvalid; |
}); |
} |
注意:启动一个后台任务时候总是提供一个过期处理,但若你想知道你的应用剩余执行时间,通过UIApplication的backgroundTimeRemaining属性的值获取。
在你自己的过期处理中可以包含关闭你任务的以外的代码。然而 在你过期处理被调用时,你的应用已经非常接近它的时间限制,所以你包含的代码执行时间不能太长。
由于这个原因,仅可以执行最小化的清空操作和结束任务操作。