有人可以在 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 分钟左右)到期时调用的 block
- 调度异步方法,输出 NSLog。在此期间,可以使用应用程序的所有其他方法
- NSLog out 后立即终止后台任务,不等待系统默认到期
具体来说,在我调用 NSLog 之后
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
任务将终止并且不会调用 expirationHandler block 。
我也觉得我的理解不正确...
最佳答案
除了一个重要细节外,关于您帖子的所有内容基本上都是正确的。这些都与 applicationDidEnterBackground
应用委托(delegate)方法无关。
应用中任何可能需要几秒钟以上的任务都应该包含在对 beginBackgroundTaskWithExpirationHandler
和 endBackgroundTask
的调用中。
在这两种方法中包装代码的全部意义在于通知操作系统您有一些处理需要继续运行,即使应用程序在运行时碰巧进入后台也是如此。如果没有这些 block ,您的应用程序将在尝试在后台运行仅几秒(10 秒?)后被操作系统终止。
关于ios 后台任务 - 解释执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308001/