24

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

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

这是我的代码:

- (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,它持有一个 long long。最后,resourceLength是一个包含 NSUInteger 的 NSNumber。

我在这里想念什么?

4

3 回答 3

29

不知道我在这里错过了什么,但你filesize的 -1 似乎是你的问题。API 文档明确指出expectedContentLength可能不可用,并且在NSURLResponseUnknownLength这些情况下会返回。 NSURLResponseUnknownLength定义为:

#define NSURLResponseUnknownLength ((long long)-1)

在这些情况下,您无法获得准确的进度。您需要处理此问题并显示某种不确定的进度表。

于 2008-11-23T19:58:58.183 回答
6

我认为您打印的文件大小错误。如果self.filesize确实是 a NSNumber,则使用%@格式打印它,因为它是一个对象,而不是原语:

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

通过使用%d,您只是打印 self.filesize 的指针值。要打印出实际的 long long 值,请使用%lli%d仅适用于 32 位值):

NSLog(@"filesize: %lli", [self.filesize longLongValue]);

所以你的 self.filesize实际上是-1 并且划分是正确的。

于 2008-11-24T01:04:02.937 回答
0

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

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

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

可能会报告该对象(或其他)的地址(id)之类的东西。这是

filesize: 4687472

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

NSURLResponseUnknownLength

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

于 2010-07-25T12:59:20.023 回答