我正在使用 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 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
。在 iOS 7.0 及更高版本中,您拥有
NSURLSession
,它允许更丰富的后台网络请求机制。 AFNetworking 提供AFURLSessionManager
作为NSURLSession
的接口(interface),但它没有AFHTTPRequestManager
健壮。请参阅 URL Loading System Programming Guide: Using URLSession 的后台传输注意事项部分.基本上,您需要:
使用
backgroundSessionConfiguration:
创建NSURLSessionConfiguration
(在 iOS 8 中,它是backgroundSessionConfigurationWithIdentifier:
)。仅发出
NSURLSessionDownloadTask
或NSURLSessionUploadTask
请求。使用那些
NSURLSessionTask
工厂方法的基于委托(delegate)的实现。确保在您的应用委托(delegate)中实现
handleEventsForBackgroundURLSession:
,保存completionHandler
。在您的
NSURLSessionDelegate
对象中实现一个URLSessionDidFinishEventsForBackgroundURLSession
方法。
关于ios - 如果应用程序处于非事件状态,AFNetWorking 在 30 秒后执行 setCompletionBlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23624074/