2010-01-06 71 views
25

我正在开发一个应用程序,需要在保存页面的整个HTML(通过链接存储每个文件一起后,需要缓存网页(完全)以及他们的CSS文件和图像与HTML文件)。iPhone的UIWebView缓慢加载到本地HTML文件

在离线查看HTML文件时,由于我已经离线,文件在磁盘上以及其CSS和图像,因此需要很长时间才能加载页面。

我使用此代码加载文件:

NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath]; 
    [wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL fileURLWithPath:self.htmlFolderPath isDirectory:YES]]; 

是否有装载文件到UIWebView能够更快加载它的任何其他方式?

P.S:它加载速度非常快的模拟器(离线),但在设备上需要很长的时间(考虑到它已经脱机缓存文件)

感谢您的帮助。

+1

这些大型网页?你正在加载什么类型的设备?请记住,许多WebKit的性能都是CPU和内存绑定的,不仅仅是连接;与加载“活”相比,速度差如何? – 2010-01-06 12:31:22

+0

是的,他们有点大,但他们离线(本地磁盘) 没有涉及到互联网连接 我正在他们的iPhone 3G上加载 – 2010-01-06 13:21:02

+1

正如本说,有一个非零的处理时间涉及渲染一个网络页。 iPhone 3G的处理器比台式机的处理器慢得多。您是否尝试将这些页面存储在本地Web服务器上并通过WiFi通过移动Safari加载它们? – 2010-01-06 15:31:54

回答

3

因为这可能只是需要时间,因为它需要解析和渲染页面,你可以考虑在后台启动UIWebView;即作为子视图添加,但不可见。

也许UIWebView足够聪明,知道它不需要做任何事情,但我怀疑至少html和css解析是马上完成的。

如果它在不可见的情况下不做任何事情,请将大小减小到1x1并将不透明度设置为0,然后将该像素放置在不会干扰触摸事件处理的位置。

不完美,但它可能工作。

0

我可以给你一个关于从文件加载HTML到UIWebView的替代方法的想法。一个小项目我有使用的Objective-C作为一个UIWebView

纯包装该项目是在这里,但主要的代码如下:http://github.com/robb1e/iWeb

- (void)viewDidLoad { 
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html" inDirectory:@"."]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 
    [super viewDidLoad]; 
} 

我还在探索改进的方法通过在DOM准备好时显示图像来感知性能。一些答案我已经在这里:

Displaying a background image on UIWebView

6

是您的解决方案实际上比HTML文件等缓存的事情,这意味着图片,CSS等,并在HTML页面中重新链接呢?我猜你正在下载并缓存html页面和外部资源,然后UIWebView正在加载该html,并且仍然要加载外部资源。这将解释模拟器上的快速性能和设备上的较慢性能。

这里是一个图书馆,旨在做你想要做的事情:ASIWebPageRequest

还应该指出,它可能只是磁盘I/O瓶颈的情况。我知道在我的项目中,我在一个可用视图中加载大图像,甚至在它们被缓存后,我注意到它们从磁盘上拉出来时有相当多的滞后,因为它们非常大。

+1

你介意在这里重新阅读你的文章并澄清。我读了很多次,并且无法真正理解你想要在第一段中说什么。该链接非常赞赏。 – Josh 2010-11-19 01:16:40

1

我几乎可以肯定你永远无法做到这一点。即使UIWebView是本地页面,UIWebView也需要一段时间来处理您的网页。

记住这一点,您可以尝试在页面显示前预加载页面。例如,如果您在用户按下按钮后显示它,请在显示按钮时预先加载页面,而不是在用户实际按下按钮时加载页面。用户不会注意到加载缓慢,因为它正在后台处理,所以当用户按下按钮时,页面已被加载。

4

我发现某些类型的CSS可以将WebView渲染停下来。例如:

body { -webkit-box-shadow:inset 0 0 100px #222; } 

这在模拟器中很好用,看起来也不错。但在手机上(即使是iPhone 4,iOS 4.2),一个简单的页面也需要10秒才能完成。

0

只是如果万一有人发生同样的,我...

我有被加载字符串html和一切资源(JS和CSS)的本地存储的一个UIWebView。

我已经面临加载与互联网连接的内容,这是一种缓慢(1或2秒加载并出现在我的控制器的web视图),但当我试图加载同一页面没有互联网连接它是快速,真快。

我记得我的HTML模板在开始<base href="http://somesite.com" />中有这个,我用它在某些内容中加载了一些图像的相对路径。

删除该作品的魅力。因此,即使您没有任何对HTML中的extern内容的引用,也可以使Web视图加载速度变慢。