Iphone UIWebView加载本地内容时出现延迟

Iphone UIWebView加载本地内容时出现延迟,iphone,uiwebview,Iphone,Uiwebview,我在UIWebView中显示了少量本地内容,大约3段文字和一幅100x100px的图像。当UIWebView被推送到导航控制器上时,显示内容大约需要半秒钟。这发生在设备上,而不是在模拟器中。显然,UIWebView在显示内容之前需要做一些工作,但是在推送视图出现之前,我是否有办法做到这一点?我自己做这件事一点运气都没有 这里是我创建和推送包含UIWebView的视图控制器的地方: ArticleViewController* viewController = [[ArticleViewContr

我在UIWebView中显示了少量本地内容,大约3段文字和一幅100x100px的图像。当UIWebView被推送到导航控制器上时,显示内容大约需要半秒钟。这发生在设备上,而不是在模拟器中。显然,UIWebView在显示内容之前需要做一些工作,但是在推送视图出现之前,我是否有办法做到这一点?我自己做这件事一点运气都没有

这里是我创建和推送包含UIWebView的视图控制器的地方:

ArticleViewController* viewController = [[ArticleViewController alloc] init];
viewController.article = article;
[viewController view]; //touch the view so it gets loaded
[viewController loadWebView]; //load the web view content
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
下面是
loadWebView
方法:

-(void)loadWebView {
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSURL *baseURL = [NSURL fileURLWithPath:path];

    NSString* content = article.content;

    NSString *html = [NSString stringWithFormat:@"\
                      <html><body style='background-color: transparent'><style type=""text/css"">body {font-family: helvetica; color: black; font-size: 10pt; margin: 10px 10px 10px 10px}</style>\
                      %@<div style='text-align:center'><a href='13443574_9709e4cf37.jpg?photographer=test' style='-webkit-tap-highlight-color:rgba(0,0,0,0);'><img src='13443574_9709e4cf37.jpg' height='160' width='230'></a></div></body></html>", content];
    [self.webView loadHTMLString:html baseURL:baseURL];
}
—(无效)loadWebView{
NSString*path=[[NSBundle mainBundle]bundlePath];
NSURL*baseURL=[NSURL fileURLWithPath:path];
NSString*content=article.content;
NSString*html=[NSString stringWithFormat:@”\
正文{字体系列:helvetica;颜色:黑色;字体大小:10pt;边距:10px 10px 10px 10px}\
%@“,内容];
[self.webView loadHTMLString:html baseURL:baseURL];
}
以前,我在viewDidLoad方法中使用了
[viewController loadWebView]
,但结果似乎是一样的。按下viewController时显示一个空白屏幕,半秒钟后加载内容


有什么想法吗?

你要让用户等待,唯一的问题是:是在webview出现之前还是之后?如果设置为“before”,则应该创建控制器,加载web视图,但等待推送它,直到-webviewdiffinishload:delegate方法触发。收到后,您可以推送视图。

问题已确认 在我的内容出现之前,我也看到了一个半秒或更长的白色屏幕延迟。只有在应用程序运行期间首次使用UIWebView时才会发生这种情况。UIWebView的连续出现几乎是瞬间的。因此,在我和其他人看来,延迟一定是因为库需要加载和初始化

预热WebKit 您无法消除延迟。但你可以将延迟移到应用程序的启动,以减轻“黑屏”对用户的烦人影响。诀窍是在应用程序启动期间,在屏幕外加载带有虚假页面的UIWebView。以硬编码字符串构建最小的web页面。我使用正确有效的HTML5内容来最小化UIWebView/WebKit分析所需的时间

这项技术在真正的硬件(iPhone3GS)上效果显著,而不仅仅是在iOS模拟器上

在我的应用程序delegates
didFinishLaunchingWithOptions
中,兼容代码的底部如下所示:

…
[self.window makeKeyAndVisible];

// Performance optimization: Warm up the UIWebView widget and its related WebKit libraries.
// We are choosing the trade-off between (A) a slight delay here during app launch to create and abandon a bogus UIWebView instance, and
// (B) a flash of white and noticeable delay as the UINavigationController slides in from the right the first UIWebView we display during the app run.
UIWebView* bogusWebView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
NSString* html = @"<!doctype html><html lang=en><head><meta charset=utf-8><title>blah</title></head><body><p>bogus content</p></body></html>";
[bogusWebView loadHTMLString:html baseURL:nil]; // Load the page.
bogusWebView = nil; // Not really needed, but self-documents that we intend to discard this object.

return YES;
…
[self.window makeKeyAndVisible];
//性能优化:预热UIWebView小部件及其相关的WebKit库。
//我们正在选择(A)在应用程序启动期间稍微延迟以创建和放弃虚假UIWebView实例,以及
//(B)当UINavigationController从右侧滑入应用程序运行期间显示的第一个UIWebView时,会出现一道白色闪光和明显的延迟。
UIWebView*bogusWebView=[[UIWebView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]];
NSString*html=@“废话虚假内容”

; [bogusWebView加载HtmlString:HtmlBaseURL:nil];//加载页面。 bogusWebView=nil;//不是真的需要,而是我们打算丢弃此对象的自我文档。 返回YES;

这种技术似乎可以减少用户第一次在屏幕上出现UIWebView时大约半秒的延迟,但不是全部。我的结论是,大部分延迟是由于WebKit预热造成的,但在屏幕上以图形方式显示UIWebView肯定会有一些开销。如果是这样的话,我们就不能通过屏幕外的工作来消除剩余的开销。但是,这种技术消除了大部分初始延迟。因此,用户对我的应用程序的第一印象不会是“慢”。

回答得很好!这也适用于WKWebView,尽管我发现在
didFinishLaunchingWithOptions
中进行初始化不起作用,我必须将代码放入显示在web视图之前的viewController中。太棒了。。。拯救我的一天。。非常感谢。