该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
及其委托手动下载。流程如下所示:
- 确保您的服务器返回
Content-Length
PDF 文件的标题。如果没有,您将永远无法知道该文件还剩下多少。
NSURLConnection
使用可以处理以下步骤的委托的新实例来处理您的请求。
- 响应标头完成后,您将获得
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
可让您检索Content-Length
标头的信息。您将使用它作为进度分数的总部分。创建一个您将写入 PDF 的新文件。
- 当数据进来时,您将收到
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
. 将数据写入文件并跟踪您收到的分数数据的总长度:percent complete = total data received / total data expected
- 文件完成后,您将收到
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
. 使用它来关闭文件,将进度更新为 100%。
- 将文件路径转换为文件 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.
}];