2012-11-03 53 views
4

我想实现一个大文件的下载和显示用户目前的进展,但块:下载大容量文件AFNetworking

-[AFURLConnectionOperation setDownloadProgressBlock:] 

返回不正确的bytesReadtotalBytesRead值(他们比他们应该更小是)。

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

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

编辑:我已经确定,即使文件没有完全下载(这恰好与比较大的文件,每次)AFNetworking调用成功块:

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:] 

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

+0

尝试https://github.com/steipete/AFDownloadRequestOperation它也支持恢复部分下载 – Felix

+0

谢谢,但由于某种原因,它不适合我。 – goodfella

回答

11

我在AFNetworking中的setDownloadProgressBlock没有问题。

维基说明如何跟踪下载进度: 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; 
    }]; 
+0

是的,我了解,我的代码与您的代码完全相同。我只是说bytesRead在大文件上也给出了不正确的数字。 – goodfella

+0

你能举个例子吗?正如我所说的,你可以忽略'bytesRead',因为它与进度无关。 – Felix

+0

你怎么用得'的NSLog(@ “%U%LLU%LLU”,bytesRead,totalBytesRead,totalBytesExpectedToRead);'? bytesRead应该在每个回调中或多或少具有相同的值。 – Felix

1

phix23回答我最初的问题,所以真的有进步块没问题。我正在回答我的编辑。

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:] 

成功块被调用时,我可以比较(是不是很辛苦的代码来实现),预计将下载的字节数下载字节数。如果下载的字节数较少 - 我可以从中断的地方继续下载文件。要做到这一点,我使用Range HTTP头中NSURLRequest,这里更多的信息:
Continue an interrupted download on iPhone
How to implement resumable file downloads on iPhone SDK

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

+0

〜goodfella“我可以比较预计下载字节数下载的字节数。(是不是很辛苦的代码来实现)。”你可否透露具体的代码?你如何得到预期的字节数?我无法找到这样的API从AFNetworking – Cindeselia

+0

你可以找到示例代码在下面的类:https://github.com/onivem/Download,特别是在setCompletionBlocks方法。请注意,该课程是为2013年5月AFNetworking编写的。 – goodfella