如何将NSURLConnection与UIProgressView集成?
我试图集成一个NSURLConnection对象与UIProgressView,所以我可以更新用户,而在后台发生文件下载。
我创build了一个单独的对象来在后台下载文件,我有问题搞清楚如何更新UIProgressView对象的进度属性与正确的值。 这可能是非常简单的事情,但我不能用谷歌search搞清楚。
这里是我有的代码:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [self.resourceData setLength:0]; self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]]; NSLog(@"content-length: %d bytes", self.filesize); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.resourceData appendData:data]; NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]]; NSLog(@"resourceData length: %d", [resourceLength intValue]); NSLog(@"filesize: %d", self.filesize); NSLog(@"float filesize: %f", [self.filesize floatValue]); progressView.progress = [resourceLength floatValue] / [self.filesize floatValue]; NSLog(@"progress: %f", [resourceLength floatValue] / [self.filesize floatValue]); }
如您所见, resourceData成员variables保存正在下载的文件数据。 filesize成员variables保存文件的完整大小,由我的web服务在Content-Length头中返回。
这一切工作顺利,我不断得到下载的数据多次执行didReceiveData我应该,但是当我尝试计算进度值,没有适当的值返回。 请参阅下面的我的控制台日志中的一个小样本:
content-length: 4687472 bytes resourceData length: 2904616 filesize: 4687472 float filesize: -1.000000 progress: -2904616.000000
作为参考, progressView.progress是一个浮点数。 filesize是一个很长的NSNumber。 最后, resourceLength是一个包含NSUInteger的NSNumber。
我在这里错过了什么?
不知道我在这里失踪,但你的filesize
为-1似乎是你的问题。 API文档明确指出expectedContentLength
可能不可用,并且在这些情况下返回NSURLResponseUnknownLength
。 NSURLResponseUnknownLength
被定义为:
#define NSURLResponseUnknownLength ((long long)-1)
在这些情况下,您无法获得准确的进展。 你需要处理这个,并显示某种不确定的进度表。
我认为你打印的文件大小错误。 如果self.filesize
确实是一个NSNumber
,那么使用%@
格式打印它,因为它是一个对象,而不是一个基元:
NSLog(@"filesize: %@", self.filesize);
通过使用%d
,你只需要打印self.filesize的指针值。 要打印出实际的long long值,使用%lli
( %d
仅适用于32位值):
NSLog(@"filesize: %lli", [self.filesize longLongValue]);
所以你的self.filesize 实际上是 -1,分割是正确的。
在你的代码中,文件大小似乎是一个NSNumber对象(!)。 所以
NSLog(@"filesize: %d", self.filesize);
和
NSLog(@"content-length: %d bytes", self.filesize);
将可能会报告类似该对象(或其他)的地址(id)的东西。 这是
filesize: 4687472
你看。 正如其他人指出的那样,响应返回的文件大小确实是-1,
NSURLResponseUnknownLength
即服务器没有返回文件大小。