我正在使用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];
两个选项:
-
参见《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
。 -
在ios7.0和更高版本中,你有
NSURLSession
,它允许更丰富的后台网络请求机制。AFNetworking提供AFURLSessionManager
作为NSURLSession
的接口,但它没有AFHTTPRequestManager
那么健壮。请参阅URL加载系统编程指南:使用URLSession中的后台传输注意事项一节。基本上,您需要:
-
使用
backgroundSessionConfiguration:
创建NSURLSessionConfiguration
(在iOS 8中,它是backgroundSessionConfigurationWithIdentifier:
)。 -
只发出
NSURLSessionDownloadTask
或NSURLSessionUploadTask
请求 -
使用基于委托的
NSURLSessionTask
工厂方法实现 -
确保在应用程序委托中实现
handleEventsForBackgroundURLSession:
,保存completionHandler
。 -
在
NSURLSessionDelegate
对象中实现URLSessionDidFinishEventsForBackgroundURLSession
方法
-