0

我有一个从服务器下载图片的应用程序。我想向用户展示进度。我已经阅读了关于苹果文档的 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);
        });
   }

当我运行这段代码

  1. UIProgressView 永远不会出现

  2. 我得到的日志是Downloading 0% complete. 我希望得到正在下载的图像的日志。

另外我认为我应该allocinitUIProgressView 中的viewDidDownload,当我这样做时,我得到 UIProgressView 但它不显示进度并且在图像下载完成后它不会隐藏。

4

2 回答 2

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;
  }
}
于 2013-08-27T04:17:50.127 回答
0

我之前也遇到过同样的问题。在这种情况下,我们无法显示准确的进度视图。为了显示准确的进度,您的服务器应提供在响应标头中发送的字节。然后,你可以在你的连接中获得确切的数据:didReceiveData:delegate。否则,您将立即获得 1.0。

即使您想在这种情况下显示进度视图而不依赖于服务器,您也可以通过将数据的长度分成 n 个步骤并使用 NSTimer 来实现它。

于 2013-08-27T06:06:00.870 回答