6

我需要使用 AFNetworking 下载文件 > 500 Mo。有时,下载它们的时间超过 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(单例)的子类。

在 AppDelegate 中:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
  // resume will only resume if it's paused...
  [[DownloadHTTPRequestOperation sharedOperation] resumeDownload];  
}

服务器可以在标头中获取新范围...

我的问题:

1)这不是好方法吗?2) 简历是否需要更改 outputStream (append: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];
}

谢谢你的帮助。

4

2 回答 2

6

更新:

由于 steipete 可能不再维护 AFDownloadRequestOperation ( https://github.com/steipete/AFDownloadRequestOperation/pull/68 )。NSURLSessionDownloadTask 可能是更好的选择。


https://github.com/steipete/AFDownloadRequestOperation

另外,我写了一个基于 AFDownloadRequestOperation 的库:https ://github.com/BB9z/RFDownloadManager

于 2012-08-28T07:15:37.733 回答
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];
}
于 2012-06-27T18:30:17.177 回答