如果应用程序处于非活动状态,AFNetWorking会在30秒后执行setCompletionBlock

时间:2014-05-13 06:23:08

标签: 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 个答案:

答案 0 :(得分:1)

两个选项:

  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;
    

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

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

    如果您执行上述操作,当应用程序进入后台时,应用程序将有几分钟时间完成网络请求。请注意,如果您在后台运行多个请求,则可能需要为每个请求单独UIBackgroundTaskIdentifier

  2. 在iOS 7.0及更高版本中,您拥有NSURLSession,这允许更丰富的后台网络请求机制。 AFNetworking提供AFURLSessionManager作为NSURLSession的界面,但它不如AFHTTPRequestManager强大。

    请参阅URL Loading System Programming Guide: Using URLSession后台转移注意事项部分。基本上,你需要:

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

    • 仅发出NSURLSessionDownloadTaskNSURLSessionUploadTask个请求。

    • 使用这些NSURLSessionTask工厂方法的基于代理的实现。

    • 确保在您的应用代理中实施handleEventsForBackgroundURLSession:,保存completionHandler

    • URLSessionDidFinishEventsForBackgroundURLSession对象中实施NSURLSessionDelegate方法。