使用AFNetworking下载大文件
我试图实现一个大文件的下载并显示给用户当前的进度,但阻止:
-[AFURLConnectionOperation setDownloadProgressBlock:]
返回不正确的bytesRead
和totalBytesRead
值(它们比它们应该小)。
例如:如果我有一个90MB的文件,当它完全下载时, setDownloadProgressBlock:
最新块调用setDownloadProgressBlock:
给我totalBytesRead
值大约30MB。 另一方面,如果文件大小是2MB,则最新的块调用将给出正确的totalBytesRead
2MB值。
AFNetworking从github更新到最新版本。
如果AFNetworking无法正确执行,我可以使用什么解决scheme?
编辑:我已经确定,即使文件没有完全下载(这种情况发生每次相对较大的文件)AFNetworking调用成功块在:
-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]
我在这里问了一个类似的问题,但没有得到任何答案。
我可以检查下载的代码和真实的文件大小,但AFNetworking
没有用于延续部分下载的API。
AFNetworking中的setDownloadProgressBlock没有问题。
维基解释了如何跟踪下载进度: https : //github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ
对于进度跟踪,您不需要bytesRead
(在特定callback中写入的字节数)。
示例代码:
[downloadoperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { float progress = ((float)totalBytesRead) / totalBytesExpectedToRead; self.progressView.progress = progress; }];
phix23回答了我最初的问题,所以进展模块确实没有问题。 我正在回答我的编辑。
当成功阻止时
-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]
被称为,我可以比较下载的字节数与预期下载的字节数(这是不是很难在代码中实现)。 如果下载的字节数较less – 我可以继续从中断的地方下载文件。 要做到这一点,我在NSURLRequest
使用Range
http头,这里是更多的信息:
在iPhone上继续中断下载
如何在iPhone SDK上实现可恢复的文件下载
所以,AFNetworking的问题并不是(NSURLConnection具有相同的行为),但我认为,框架的开发者可以考虑到这种情况。