在介绍问题之前,我想提及一下,我曾尝试寻找解决方案herehere
我正在创建一个混合应用程序,该应用程序使用本机UIWebView呈现响应式设计的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不能在此处应用。
我还想到了increasing发射映像的持续时间,但了解到这不是一个好习惯。
可以使用 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视图将以非阻塞方式在后台加载。您可以将其与在加载时隐藏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,因为它在视图具有WebView时崩溃

关于ios - 每次启动时均会出现UIWebView白屏,同时预加载所有选项卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28272576/

10-14 10:10
查看更多