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



我正在使用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应用程序编程指南:应用程序状态和多任务处理》的后台一节中的执行有限长度任务。基本上,在你开始你的网络请求之前,通知操作系统,如果应用程序碰巧进入后台,你想请求额外的时间来完成这个网络请求:

    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. 在ios7.0和更高版本中,你有NSURLSession,它允许更丰富的后台网络请求机制。AFNetworking提供AFURLSessionManager作为NSURLSession的接口,但它没有AFHTTPRequestManager那么健壮。

    请参阅URL加载系统编程指南:使用URLSession中的后台传输注意事项一节。基本上,您需要:

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

    • 只发出NSURLSessionDownloadTaskNSURLSessionUploadTask请求

    • 使用基于委托的NSURLSessionTask工厂方法实现

    • 确保在应用程序委托中实现handleEventsForBackgroundURLSession:,保存completionHandler

    • NSURLSessionDelegate对象中实现URLSessionDidFinishEventsForBackgroundURLSession方法

相关内容

  • 没有找到相关文章

最新更新