使用AFNetworking下载大文件

时间:2012-11-03 08:14:15

标签: iphone objective-c ios cocoa-touch afnetworking

我正在尝试实施大型文件的下载并向用户显示当前进度,但阻止在:

-[AFURLConnectionOperation setDownloadProgressBlock:] 

返回错误的bytesReadtotalBytesRead值(它们比它们应该的小)。

例如:如果我有一个90MB的文件,当它完全下载时,setDownloadProgressBlock:中的最新块调用给我totalBytesRead值大约30MB。另一方面,如果文件大小为2MB,则最新的块调用会给出正确的totalBytesRead 2MB值。

AFNetworking从github更新到最新版本 如果AFNetworking无法正确执行,我可以使用什么解决方案?

编辑:我已经确定即使文件没有完全下载(每次使用相对较大的文件时都会发生这种情况),AFNetworking会调用成功块:

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]

关于这种情况,我问了一个类似的问题here,但没有得到任何答案 我可以检查已下载的代码和实际文件大小,但AFNetworking没有继续部分下载的API。

2 个答案:

答案 0 :(得分:12)

我对AFNetworking中的setDownloadProgressBlock没有任何问题。

wiki解释了如何跟踪下载进度: https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ

对于进度跟踪,您不需要bytesRead(在特定回调中写入的字节数)。

示例代码:

[downloadoperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
        float progress = ((float)totalBytesRead) / totalBytesExpectedToRead;
        self.progressView.progress = progress;
    }];

答案 1 :(得分:1)

phix23回答了我的初步问题,因此进度块确实没有问题。我正在回答我的编辑。

成功阻止

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]
调用

,我可以将下载的字节数与预期下载的字节数进行比较(在代码中实现起来并不是很难)。如果下载的字节数较小 - 我可以从中断的地方继续下载文件。为此,我在Range中使用NSURLRequest http标头,以下是更多信息:
Continue an interrupted download on iPhone
How to implement resumable file downloads on iPhone SDK

所以,问题不在于AFNetworking(NSURLConnection有相同的行为),但我认为,框架的开发人员可以考虑这种情况。