繁体   English   中英

如何将NSURLConnection与UIProgressView集成?

[英]How to integrate NSURLConnection with UIProgressView?

我正在尝试将NSURLConnection对象与UIProgressView集成,因此我可以在后台进行文件下载时更新用户。

我创建了一个单独的对象来在后台下载文件,我在确定如何使用正确的值更新UIProgressView对象中的progress属性时遇到了问题。 这可能是非常简单的事情,但我无法通过谷歌搜索来解决这个问题。

这是我的代码:

- (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成员变量在下载文件数据时保存文件数据。 filesize成员变量保存文件的完整大小,由我的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,而且除法是正确的。

在您的代码中,filesize似乎是一个NSNumber对象(!)。 所以

NSLog(@"filesize: %d", self.filesize);

NSLog(@"content-length: %d bytes", self.filesize);

可能会报告类似该对象的地址(id)(或其他内容)。 这是

filesize: 4687472

你看。 正如其他人所指出的,响应返回的文件大小确实为-1,即

NSURLResponseUnknownLength

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM