使用AFNetworking下载大文件

Ale*_*der 4 iphone cocoa-touch objective-c ios afnetworking

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

-[AFURLConnectionOperation setDownloadProgressBlock:] 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*lix 12

我对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;
    }];
Run Code Online (Sandbox Code Playgroud)

  • AFNetworking正确地做了,看看来源:https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLConnectionOperation.m#L542显然连接被过早取消,可能是因为没有足够的磁盘空间.我假设您已经设置了写入文件的NSOutputStream.否则你会消耗很多内存,因此iOS可能会取消下载. (2认同)