如何将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可能不可用,并且在这些情况下返回NSURLResponseUnknownLengthNSURLResponseUnknownLength被定义为:

 #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

即服务器没有返回文件大小。