在我提出问题之前,我想提一下,我尝试寻找解决方案here和here。
我正在创建一个混合应用程序,它使用本机UIWebView
来呈现响应式设计的Web应用程序。以下是问题描述:
我有一个UITabBarController
2.每个标签都有一个UIWebView
我必须预先加载所有标签
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 我还想到了increasing发射图像的持续时间,但是我知道这不是一个好习惯 可以使用 GCD 实现吗? 请揭示我的实现中的缺陷,以便我的应用程序提高性能。
答案 0 :(得分:3)
首先,在每个选项卡上隐藏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视图以非阻塞方式加载到后台。您可以将其与加载时隐藏Web视图结合使用,以防用户在页面加载之前导航到其他选项卡。
我用三个标签对它进行了测试,效果很好。
所以第一个视图控制器看起来像这样: @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,因为当视图具有WebViews时崩溃了
答案 1 :(得分:2)
This发布了我的一天。我现在正在使用NSNotificationCenter
。
答案 2 :(得分:1)
很难确定问题的直接位置。
首先,我建议您通过在同一台Wifi上的桌面计算机上加载页面来检查您的网络连接,看看它是否是您的服务器太慢。
此外,您可以逐个加载页面,而不是同时加载所有页面,因为多个HTTP请求未在FIFO序列中处理,它们可能无序处理,并且您的页面可能需要先加载所有资源显示。
你自己控制网页吗?您可以使用safari检查器检查您的网页,以查看花费的时间,资源加载,javascript处理或渲染。