我有一个从服务器下载图片的应用。我想向用户展示进展情况。我已经阅读了关于苹果文档的UIProgressView,并在这个网站上阅读了很多答案,但我无法让它工作。这是我的代码
在我的viewDidLoad
我有
_profileProgressView.hidden= YES;
_profileProgressView.progress = 0.0;
在我的- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
中,我显示了UIProgressView,然后获得了预期的图像大小。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
self.profileProgressView.hidden= NO;
[self.remote_response setLength:0];
received = 0;
self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
NSLog(@"Content Length::%@", self.filesize);
}
在我的- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d
中,我计算下载图像的百分比,然后更新UIProgressView的进度并记录下载进度。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
[self.remote_response appendData:d];
NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.remote_response length]];
dispatch_async( dispatch_get_main_queue(), ^ {
float progress = (_profileProgressView.progress + ([self.filesize floatValue]/[resourceLength floatValue])*100);
[self.profileProgressView setProgress:progress animated:YES];
NSLog(@"Downloading %.0f%% complete", _profileProgressView.progress);
});
}
当我运行此代码时
UIProgressView永远不会显示
我得到的日志是Downloading 0% complete
。我希望得到正在下载的图像的日志。
此外我还以为alloc
和init
viewDidDownload
中的UIProgressView,当我这样做时,我得到UIProgressView,但它没有显示进度,并且它不会隐藏图像已下载完毕。
答案 0 :(得分:1)
我认为你使用NSNumber对数学类型的装箱和拆箱进行数学复杂化。
我要做的是创建三个变量:
double fileLength;
double lastProgress;
double currentLength;
然后做简单的数学运算:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
fileLength = [response expectedContentLength];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
double length = [d length];
currentLength += length;
double progress = currentLength/fileLength;
if (lastProgress < progress) {
profileProgressView.progress = progress;
lastProgress = progress;
}
}
答案 1 :(得分:0)
之前我也经历过同样的问题。在这种情况下,我们无法显示准确的进度视图。为了显示准确的进度,您的服务器应提供响应头中发送的字节。然后,你可以在你的连接中获得确切的数据:didReceiveData:delegate。否则,你会立即得到1.0。
即使您希望在没有服务器依赖性的情况下显示进度视图,也可以通过将数据长度分成n个步骤并使用NSTimer来进行处理来实现。