3

背景

  1. 我的应用程序的用户对我的应用程序执行了某些操作,该应用程序使用一些完成处理程序安排异步 AFNetworking HTTP 请求。

  2. 然后,我的应用程序的用户立即进入主屏幕,因此我的应用程序进入后台。

网络非常慢,所以我的应用会在 20 秒后收到响应,这意味着网络响应会在我的应用处于后台状态时到达。

问题

  1. 这个网络请求会发生什么,特别是它的完成处理程序?

  2. 我知道,dispatch_async 保留了传递给它的块的所有东西,所以我希望我的响应的完成处理程序在某个时候被执行,是这样吗?

附言

我不是指打算在应用程序处于后台时运行的异步 HTTP 请求,而是指在应用程序处于正常状态时执行的常规异步 HTTP 请求。


更新 1

我确实在相关主题中找到了部分答案:当应用程序在 iOS 中进入非活动/后台/挂起状态时,调度队列中的任务会发生什么?.

我很快就会引用它:

当一个应用程序被挂起时,整个过程都被冻结了……存在于预挂起 GCD 队列中的任务在恢复时不会消失。他们从未离开;他们只是暂停了。

我尝试过的最简单的测试如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    double delayInSeconds = 10.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        NSLog(@"I am alive!");
    });
    return YES;
}

如果我启动这个应用程序,然后立即进入后台,然后等待足够的时间(这样可以通过 10 秒),然后激活它 - 我看到 NSLog 消息如何出现在控制台中。


仍然不明白这如何应用于延迟的 HTTP 响应 - 如果应用程序被冻结 - 那么它们是如何处理的?如果有人知道应用程序向后台的转换如何影响它处理延迟的 HTTP 响应的方式,请分享您的知识!

4

1 回答 1

4

您必须向操作系统询问时间才能在后台继续执行任务。

来自苹果文档:

在挂起之前的任何时候,应用程序都可以调用 beginBackgroundTaskWithExpirationHandler: 方法来请求系统额外的时间以在后台完成一些长时间运行的任务。如果请求被批准,并且如果应用程序在任务进行时进入后台,系统会让应用程序运行额外的时间而不是暂停它

一般来说,您的问题的答案是肯定的,只要在应用程序处于后台时作业不需要超过 10 分钟即可完成,就会在后台调用完成处理程序。

于 2013-11-12T13:26:10.850 回答