我需要下载文件> 500 Mo与AFNetworking。 有时,下载它们的时间是> 10分钟,如果应用程序处于后台,则下载无法完成。
所以我想尝试部分下载。我找到了很多链接,这似乎可以在AFHTTPRequestOperation上使用pause()和resume()方法。
实际上,我做了:
[self.downloadOperation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{
// Clean up anything that needs to be handled if the request times out
[self.downloadOperation pauseDownload];
}];
DownloadOperation是AFHTTPRequestOperation(singleton)的子类。
在AppDelegate中:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// resume will only resume if it's paused...
[[DownloadHTTPRequestOperation sharedOperation] resumeDownload];
}
服务器可以在标题中获取新范围...
我的问题:
1)是不是这样做的好方法? 2)简历是否需要更改outputStream(追加:NO => append:YES)?或者它是由AFNetworking管理的吗? (找不到)
self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES];
像这样的东西(在DownloadHTTPRequestOperation中):
- (void)pauseDownload
{
NSLog(@"pause download");
[self pause];
}
- (void)resumeDownload
{
NSLog(@"resume download");
self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES];
[self resume];
}
感谢您的帮助。
答案 0 :(得分:6)
更新
由于steipete可能不再维护AFDownloadRequestOperation(https://github.com/steipete/AFDownloadRequestOperation/pull/68)。 NSURLSessionDownloadTask可能是更好的选择。
https://github.com/steipete/AFDownloadRequestOperation
另外,我在AFDownloadRequestOperation上编写了一个lib库:https://github.com/BB9z/RFDownloadManager
答案 1 :(得分:1)
我最终使用旧的(非ARC)ASIHTTPRequest框架来完成类似的任务。 AllowResumeForFileDownloads 可以满足您的需求。请注意,您的服务器需要通过读取 Range http标头来支持恢复。
if (![[NSFileManager defaultManager] fileExistsAtPath:downloadPath]){
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setAllowResumeForFileDownloads:YES];
[request setDownloadDestinationPath:downloadPath];
[request setTemporaryFileDownloadPath:tmpPath];
[request startAsynchronous];
}