每次启动时UIWebView白屏,同时预加载所有选项卡

在提出我的问题之前,我想提一提,我尝试在这里这里寻找解决scheme。
我正在创build一个混合应用程序,它使用本机UIWebView呈现响应式devise的Web应用程序。 以下是问题描述:
1.我有一个UITabBarController
2.每个选项卡都有一个UIWebView
3.我必须预载所有标签。
4.我显示一个UIActivityIndicator直到内容加载到第一个选项卡上。
5.白屏出现约8-10秒 ,然后内容开始出现。
我会很高兴看到这个时间成为2-4秒

以下是我的实施:

 [self performSelectorOnMainThread:@selector(loadAllTabs) withObject:nil waitUntilDone:YES]; -(void) loadAllTabs { for(UIViewController * viewController in self.viewControllers){ if(![[NSUserDefaults standardUserDefaults]boolForKey:@"isSessionExpired"]) { if((int)[self.viewControllers indexOfObject:viewController] != 4) { viewController.tabBarItem.tag = (int)[[self viewControllers] indexOfObject:viewController]; [viewController view]; } } } } 

在WebView控制器的viewDidLoad我有:

 [_tgWebView loadRequest:[NSURLRequest requestWithURL:homeURL]]; 

我期待SuppressesIncrementalRendering ,但由于我预载所有标签,这是行不通的。 由于我的应用程序支持iOS 7+ ,因此WKWebView无法在这里应用。
我也想过增加发射图像的时间,但得知这不是一个好的做法。
这可以使用GCD来实现吗?
请带出我的实现中的陷阱,使我的应用程序更好的性能。

首先,隐藏每个选项卡上的UIWebView,直到完成加载,然后显示它。 在UIWebView下面,您可以使用一些占位符图像来描述它的加载。 然后使用webViewDidFinishLoad委托方法在完成加载时显示Web视图。 这种方法将是非阻塞的。

 - (void)webViewDidFinishLoad:(UIWebView *)webview { if (webview.isLoading) return; else webView.hidden = false; } 

其次,预加载第一个选项卡,然后加载后续选项卡,同时显示第一个选项卡。 你可以通过在第一个标签的viewDidLoad方法中放置下面的代码来做到这一点:

 // Preload the subsquent tabs for (UIViewController *aVC in self.tabBarController.viewControllers) if ([aVC respondsToSelector:@selector(view)] && aVC != self) aVC.view; 

这样,附加的选项卡Web视图将以非阻塞的方式加载到后台。 您可以将其与加载时隐藏networking视图结合使用,以防用户在加载页面之前导航到其他选项卡。

我用三个选项卡testing了它,它工作得很好。

所以第一个视图控制器可能看起来像这样:@implementation FirstViewController

 - (void)viewDidLoad { [super viewDidLoad]; // Load the website [self loadWebView]; // Preload the subsquent tabs for (UIViewController *aVC in self.tabBarController.viewControllers) if ([aVC respondsToSelector:@selector(view)] && aVC != self) aVC.view; } -(void)loadWebView { // Create Request NSURL *url = [NSURL URLWithString:@"http://anandTech.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // Load the page [webView loadRequest:request]; } - (void)webViewDidFinishLoad:(UIWebView *)webview { if (webview.isLoading) return; else webView.hidden = false; } 

编辑:删除GDC,当视图有WebView时它崩溃了

这个职位是我的一天。 我现在正在使用NSNotificationCenter

很难确定问题的直接来源。

首先,我build议你检查你的networking连接,在同一个Wifi上加载桌面计算机上的网页,看看你的服务器是否太慢了。

您也可以逐个加载您的页面,而不是同时加载所有页面,因为多个HTTP请求没有在FIFO序列中处理,它们可能不按顺序处理,并且您的页面在显示之前可能需要加载所有资源。

你控制自己的网页吗? 您可以使用Safari浏览器检查您的网页,看看花费的时间,资源加载,JavaScript处理或渲染。