English 中文(简体)
如何将NSURLConnection与UIProgressView集成?
原标题:
  • 时间:2008-11-23 18:26:22
  •  标签:

我正在尝试将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 是一个 long long 的 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);

和 (hé)

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

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

filesize: 4687472

你看。正如其他人指出的那样,响应返回的文件大小确实是-1,即表示无法确定大小。

NSURLResponseUnknownLength

即服务器未返回文件大小。





相关问题
热门标签