ios - 如果应用程序处于非事件状态,AFNetWorking 在 30 秒后执行 setCompletionBlock

标签 ios objective-c timeout afnetworking nsurlrequest

我正在使用 AFNetworking用于下载我的项目之一中的文件。

如果我的应用处于唤醒状态,一切都可以正常下载。

错误发生在以下情况。

  • 我保留下载。
  • 我离开应用程序超过 30 秒
  • 当我回来时,它执行 setCompletionBlock,因此我的下载未完成。

如果我在 30 秒之前回到应用程序,下载会继续。

知道如何解决这个问题吗?


我尝试将 NSURLRequest 的超时间隔设置为 300,但它仍然在 30 秒后执行 setCompletionBlock

NSURLRequest *request = [NSURLRequest requestWithURL:
  [NSURL URLWithString:currentURL] cachePolicy:NSURLRequestUseProtocolCachePolicy 
  timeoutInterval:300];
operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation start];

最佳答案

两种选择:

  1. 请参阅 iOS App Programming Guide:App States and Multitasking在后台执行有限长度任务部分.基本上,在开始网络请求之前,如果应用程序恰好进入后台,请通知操作系统您想要请求额外的时间来完成此网络请求:

    UIApplication *application = [UIApplication defaultApplication];
    
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    

    这假设您有一些实例变量或类属性用于该 bgTask:

    UIBackgroundTaskIdentifier bgTask;
    

    无论如何,在网络请求的完成 block 中,结束后台任务:

    if (bgTask != UIBackgroundTaskInvalid) { 
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
    

    如果您执行上述操作,应用进入后台时将被允许有几分钟的时间来完成网络请求。请注意,如果您有多个请求在后台运行,您可能希望每个请求都有一个单独的 UIBackgroundTaskIdentifier

  2. 在 iOS 7.0 及更高版本中,您拥有 NSURLSession,它允许更丰富的后台网络请求机制。 AFNetworking 提供 AFURLSessionManager 作为 NSURLSession 的接口(interface),但它没有 AFHTTPRequestManager 健壮。

    请参阅 URL Loading System Programming Guide: Using URLSession后台传输注意事项部分.基本上,您需要:

    • 使用 backgroundSessionConfiguration: 创建 NSURLSessionConfiguration(在 iOS 8 中,它是 backgroundSessionConfigurationWithIdentifier:)。

    • 仅发出 NSURLSessionDownloadTaskNSURLSessionUploadTask 请求。

    • 使用那些 NSURLSessionTask 工厂方法的基于委托(delegate)的实现。

    • 确保在您的应用委托(delegate)中实现 handleEventsForBackgroundURLSession:,保存 completionHandler

    • 在您的 NSURLSessionDelegate 对象中实现一个 URLSessionDidFinishEventsForBackgroundURLSession 方法。

关于ios - 如果应用程序处于非事件状态,AFNetWorking 在 30 秒后执行 setCompletionBlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23624074/

相关文章:

ios - 如何更改 Storyboard上的标签栏背景颜色和标签栏项目颜色

android - Websocket 根据操作系统给出不同的数字

ios - 忽略 Phonegap/Cordova 2.3.0 iOS 白名单

ios - 在大多数情况下是否需要异步核心数据?

在空指针异常的情况下,Java 与 Objective C

objective-c - 交换 View - NSWindowController 和 NSViewController

ios - Assets 目录与文件夹引用 : When to use one or the other?

asp.net - 是否可以在ASP.NET中更改单个页面的网页超时阈值?

MySQL 连接超时问题 - 使用 Hibernate 和 ORM 的 Tomcat 上的 Grails 应用程序

javascript - Node PostgreSQL 超时客户端的查询