我怀疑你会发现问题是totalBytesExpectedToRead
。具体来说,这来自于NSURLResponse
财产,expectedContentLength
, which 正如文档所说 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLResponse_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURLResponse/expectedContentLength:
返回值
接收者的预期内容长度,或NSURLResponseUnknownLength
如果无法确定长度。
讨论
某些协议实现将内容长度报告为响应的一部分,但并非所有协议都保证传送该数据量。客户应该准备好处理或多或少的数据。
顺便说一下,这个常数,NSURLResponseUnknownLength
,等于 -1,这可以解释您的计算值。这只是系统通知您无法确定响应长度的方式。
因此,在最坏的情况下,您将得到 -1 作为预期的字节数。即使它不是 -1,它也不完全可靠(如果您编写了自己的服务器代码,则尤其是一个问题)。你的应用程序必须优雅地处理任何事情expectedContentLength
会报告给您的应用程序。大多数时候,如果您获得非负值,则通常会获得一个可有效用于“完成百分比”计算的值,但不要依赖它(例如,您可能会收到更多字节)或少于以下字节expectedContentLength
报告)。优雅地处理特殊值。
例如,在设置进度条时,我做了类似的事情:
CGFloat progress;
if (expectedContentLength > 0 && progressContentLength <= expectedContentLength)
progress = (CGFloat) progressContentLength / expectedContentLength;
else
progress = (progressContentLength % 1000000l) / 1000000.0f;
如果我有良好的预期内容长度值,这会给我一个进度条,随着下载的进行,进度条会缓慢进展到 100%,但否则会显示一个进度条,每下载 1,000,000 字节,进度条就会从 0% 进展到 100%。后一种情况并不理想,但除非您的服务器报告准确的预期内容长度,否则您无能为力。
或者,如果您从未获得可靠的expectedContentLength
,您可以选择使用不确定的进度视图(例如UIActivityIndicatorView
)这完全避免了这个问题。
最重要的是,成功计算进度取决于您的服务器是否为预期字节提供合法值。如果你看totalBytesExpectedToRead
,我敢打赌你会得到 -1,并看到你好奇的计算出的进度百分比值作为结果。