gpt4 book ai didi

ios - 如何在 iOS 中显示 pdf 下载的加载状态

转载 作者:行者123 更新时间:2023-11-28 22:29:30 25 4
gpt4 key购买 nike

我有一个应用程序,用户可以在其中导航到存储在我网站上的 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 秒。

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

最佳答案

UIWebViewDelegate 协议(protocol)提供了一些基本的 Hook ,用于跟踪请求何时开始和停止。在您的 View Controller 中,您可以执行类似于以下的操作:

- (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
}

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

  1. 确保您的服务器返回 PDF 文件的 Content-Length header 。否则,您将永远无法知道文件中还有多少内容。
  2. 为您的请求使用一个新的 NSURLConnection 实例,委托(delegate)可以处理以下步骤。
  3. 当响应 header 完成时,您将获得 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 可以让您检索 Content-Length标题。您将使用它作为进度分数的总和。创建一个新文件,您将在其中写入 PDF。
  4. 当数据进来时,你会收到- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data。将数据写入文件并跟踪您收到的部分数据的总长度:完成百分比 = 收到的总数据/预期的总数据
  5. 文件完成后,您将收到 - (void)connectionDidFinishLoading:(NSURLConnection *)connection。使用此关闭文件,将进度更新为 100%。
  6. 将文件路径转换为文件 URL,创建一个新的 NSURLRequest 并将其提供给 WebView 。

显然,这可能会很痛苦,而且还有其他考虑因素,因此如果这是您要寻找的东西,您应该考虑第三方库。使用 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.
}];

关于ios - 如何在 iOS 中显示 pdf 下载的加载状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com