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

标签 ios

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

相关文章:

ios - 与当前时间的差异 - 使用 String 而不是 dateWithEra

ios - 通过 UIimageview 和 uiimagepicker 显示圆形图片

ios - 如何获取支持iOS 9的init(coordinates)的较早语法?

ios - 如何使用 OpenGL ES 共享组在 iPad 上共享渲染缓冲区以进行屏幕镜像?

ios - 为什么 UIImageView 在滚动之前不显示圆角?

ios - wait_fences : failed to receive reply: 10004003 with MessageUI

c# - 为 NSUncaughtExceptionHandler 引发异常

ios - 在 UI 测试中找到 UIRefreshControl

ios - 从 viewDidLoad 中调用的函数外部重新加载 UITableViewController

ios - 固定背景图像 PhoneGap/类固醇?