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

标签 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 分钟左右)到期时调用的 block
  2. 调度异步方法,输出 NSLog。在此期间,可以使用应用程序的所有其他方法
  3. NSLog out 后立即终止后台任务,不等待系统默认到期

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

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

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

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

最佳答案

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

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

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

关于ios 后台任务 - 解释执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308001/

相关文章:

ios block w/self = 无限循环

ios - UIWebView 在 iOS 8 中显示空白屏幕

ios - 如何聚合来自多个 NSURLSessionDataTasks 的响应?

java - 我正在尝试掌握如何将界面从 android 转换为 Objective-C

Objective-C block 与选择器。哪一个更好?

iphone - 以时间间隔链接 UIView 动画

ios - 如何在 iPhone 中播放实时音频?

css - 用作base-64背景图像数据时如何更改svg填充颜色?

html - 删除背景并放置新背景

css - 弧形菜单标签