iPhone UIWebView缓慢加载到本地HTML文件

时间:2010-01-06 12:13:50

标签: iphone uiwebview view offline performance

我正在开发一个应用程序,需要在保存页面的整个HTML之后(完全)缓存网页及其CSS文件和图像(通过链接将每个文件与HTML文件一起存储)。

在离线查看HTML文件时,UIWebView需要很长时间才能加载页面,因为我已经离线,并且文件在磁盘上连同其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:它在模拟器上加载速度非常快(离线),但在设备上需要很长时间(考虑到已经离线的缓存文件)

感谢您的帮助。

7 个答案:

答案 0 :(得分:6)

你的解决方案是否真的缓存了html文件以外的东西,包括图片,CSS等,并在html页面中重新链接它们?我猜你正在下载并缓存html页面和外部资源,然后UIWebView正在加载该html并仍然出去加载外部资源。这可以解释模拟器上的快速性能和设备上较慢的性能。

这是一个专门用于完成您要执行的操作的库:ASIWebPageRequest

还应该注意,它可能只是磁盘I / O瓶颈的情况。我知道在我的项目中,我在一个uitableview中加载大图像,甚至在它们被缓存之后我注意到将它们从磁盘上拉下来时会有一点滞后因为它们太大了。

答案 1 :(得分:4)

我发现某些类型的CSS可以使WebView渲染停止。例如:

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

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

答案 2 :(得分:3)

由于这可能只需要时间,因为它需要解析和呈现页面,您可以考虑在后台启动UIWebView;即添加为子视图,但不可见。

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

如果在没有可见的情况下没有做任何事情,请将大小减小到1x1并设置opacity = 0,并将该像素放在不会干扰触摸事件处理的位置。

不完美但可能有效。

答案 3 :(得分:1)

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

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

答案 4 :(得分: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

答案 5 :(得分:0)

如果有人发生同样的事情......

我有一个正在加载字符串html的UIWebView,并且每个资源(js和css)都存储在本地。

我已经面临用互联网连接加载内容它有点慢(加载并在我的控制器中显示webview的1或2秒)但是当我尝试加载相同页面而没有互联网连接时它很快,真的很快。

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

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

答案 6 :(得分:0)

就我而言,在将本地html文件加载到webview时也花费了太多时间。

尝试如下所示加载本地html文件,它对我有用:

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"website_and_mobile_tnc-1" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil]; 
[_TandCView loadHTMLString:[headerString stringByAppendingString:htmlString] baseURL:nil];

如果要使用NSData加载,请尝试在代码中将baseUrl设置为“ nil”。

我已如下修改您的代码,

    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath];
  [wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:nil];

我没有尝试过,但是请尝试让我知道。