我正在使用AFNetworking在我的某个项目中下载文件。
如果我的应用程序处于清醒状态,一切正常下载。
以下情况发生错误。
setCompletionBlock
,因此我的下载不完整。如果我在30秒前回到应用程序,则继续下载。
知道如何解决这个问题吗?
我尝试将NSURLRequest的超时间隔设置为300,但仍然会在30秒后执行setCompletionBlock
。
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:currentURL] cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:300];
operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation start];
答案 0 :(得分: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
。
在iOS 7.0及更高版本中,您拥有NSURLSession
,这允许更丰富的后台网络请求机制。 AFNetworking提供AFURLSessionManager
作为NSURLSession
的界面,但它不如AFHTTPRequestManager
强大。
请参阅URL Loading System Programming Guide: Using URLSession的后台转移注意事项部分。基本上,你需要:
使用NSURLSessionConfiguration
创建backgroundSessionConfiguration:
(在iOS 8中,它是backgroundSessionConfigurationWithIdentifier:
)。
仅发出NSURLSessionDownloadTask
或NSURLSessionUploadTask
个请求。
使用这些NSURLSessionTask
工厂方法的基于代理的实现。
确保在您的应用代理中实施handleEventsForBackgroundURLSession:
,保存completionHandler
。
在URLSessionDidFinishEventsForBackgroundURLSession
对象中实施NSURLSessionDelegate
方法。