jpm*_*jpm 24 iphone cocoa-touch objective-c ios
我正在尝试将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]);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,resourceData成员变量在下载文件数据时保存文件数据.该文件大小成员变量保存文件的完整尺寸,在其Content-Length头我的web服务返回.
这一切都很好,我继续按照我的意愿多次执行didReceiveData下载数据,但是当我尝试计算进度值时,没有返回适当的值.请参阅下面的示例,了解我在控制台日志中获得的一小部分示例:
content-length: 4687472 bytes
resourceData length: 2904616
filesize: 4687472
float filesize: -1.000000
progress: -2904616.000000
Run Code Online (Sandbox Code Playgroud)
作为参考,progressView.progress是一个浮点数.filesize是一个持有很长时间的NSNumber.最后,resourceLength是一个拥有NSUInteger的NSNumber.
我在这里错过了什么?
Dav*_*bin 29
不知道我在这里缺少什么,但你filesize的-1似乎是你的问题.该API文档明确指出,expectedContentLength可能无法使用,并且NSURLResponseUnknownLength在这种情况下返回. NSURLResponseUnknownLength定义为:
#define NSURLResponseUnknownLength ((long long)-1)
Run Code Online (Sandbox Code Playgroud)
在这些情况下,您无法获得准确的进展.您需要处理此问题并显示某种不确定的进度表.
我认为你打印出错误的文件大小.如果self.filesize确实是NSNumber,则使用%@格式打印它,因为它是一个对象,而不是一个基元:
NSLog(@"filesize: %@", self.filesize);
Run Code Online (Sandbox Code Playgroud)
通过使用%d,您只需打印self.filesize 的指针值.要打印出实际的long long值,请使用%lli(%d仅适用于32位值):
NSLog(@"filesize: %lli", [self.filesize longLongValue]);
Run Code Online (Sandbox Code Playgroud)
所以你的self.filesize 实际上是 -1,而且除法是正确的.
| 归档时间: |
|
| 查看次数: |
28250 次 |
| 最近记录: |