0

我有一个应用程序,用户有时会导航到存储在我网站上的 PDF。我正在使用此代码来显示 pdf

   NSURL *myUrl = [NSURL URLWithString:@"http://www.mysite.com/test.pdf"];
   NSURLRequest *myRequest = [NSURLRequest requestWithURL:myUrl];

   [webView loadRequest:myRequest];

   [window addSubview: myWebView];

它工作正常,但是实际下载和显示 pdf 需要 1-2 秒。

现在屏幕在那段时间只是空白,我想知道是否有办法显示“旋转加载指示器”(这也是所谓的)以及如何确定下载的状态......有吗下载开始时或下载中途时调用的方法?我可以得到一个百分比吗?

4

2 回答 2

2

UIWebViewDelegate协议提供了一些基本的钩子来跟踪请求何时开始和停止。在您的视图控制器中,您可以执行类似于以下的操作:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.webView.delegate = self;
}

- (void)webViewDidStartLoad:(UIWebView *)webView
{
    // Start spinner
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // Stop spinner
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    // Stop spinner, show error
}

为了显示进度百分比,您将不得不做一些更复杂的事情,因为您需要诸如预期字节数和接收字节数之类的信息。这需要您使用 aNSURLConnection及其委托手动下载。流程如下所示:

  1. 确保您的服务器返回Content-LengthPDF 文件的标题。如果没有,您将永远无法知道该文件还剩下多少。
  2. NSURLConnection使用可以处理以下步骤的委托的新实例来处理您的请求。
  3. 响应标头完成后,您将获得- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response可让您检索Content-Length标头的信息。您将使用它作为进度分数的总部分。创建一个您将写入 PDF 的新文件。
  4. 当数据进来时,您将收到- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data. 将数据写入文件并跟踪您收到的分数数据的总长度:percent complete = total data received / total data expected
  5. 文件完成后,您将收到- (void)connectionDidFinishLoading:(NSURLConnection *)connection. 使用它来关闭文件,将进度更新为 100%。
  6. 将文件路径转换为文件 URL,创建一个新的NSURLRequest并将其提供给 Web 视图。

显然,这可能会很痛苦,并且还有其他考虑因素,因此如果这是您正在寻找的内容,您应该考虑使用第三方库。使用 AFNetworking,您可以使用输出流下载文件并跟踪进度:

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:@"download.pdf" append:NO];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    float progress = ((float)totalBytesRead) / totalBytesExpectedToRead;
    // Do something.
}];
于 2013-07-25T18:33:31.327 回答
0

AFNetworking与诸如MBProgressHUD 之类的进度 HUD 结合使用。

或者,使用NSURLConnection并利用委托方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

并跟踪接收数据/总数据。

于 2013-07-25T18:28:22.170 回答