每次启动时UIWebView白屏都会预加载所有标签

时间:2015-02-02 07:03:24

标签: ios objective-c performance uiwebview uitabbarcontroller

在我提出问题之前,我想提一下,我尝试寻找解决方案herehere。 我正在创建一个混合应用程序,它使用本机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 实现吗? 请揭示我的实现中的缺陷,以便我的应用程序提高性能。

3 个答案:

答案 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处理或渲染。