iOS UIWebView loadRequest 耗时太长

Posted

技术标签:

【中文标题】iOS UIWebView loadRequest 耗时太长【英文标题】:iOS UIWebView loadRequest takes too long 【发布时间】:2015-03-18 09:16:43 【问题描述】:

我的应用中有一个UIWebView

-(void)viewDidLaod
    NSURL *url = [NSURL URLWithString:@"some url string"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadRevalidatingCacheData timeoutInterval:30.0];        
    myWbView.delegate = self;
        [myWebView loadRequest:request];

        if ([timer isValid]) 
            [timer invalidate];
        else
            timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(addSec:) userInfo:nil repeats:YES];
             //counting seconds


-(void)webViewDidFinishLoad:(UIWebView *)webView
    if (webView.isloading)
    NSLog(@"LOADING");//it takes 5-8 seconds in average keep logging this
    else
    NSLog(@"FINISH");//since the request started,8-15 seconds later this is logged out
    


- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
NSLog(@"LOAD FAIL: %@",error);

这是我正在尝试加载的 webpage, 我将 webview 控制器放在 pageViewController 中,每次我滑动到下一页时,都会启动一个新的加载请求。

(当刷出视图时,我确实会停止任何未完成的加载,因此它不会阻塞网络踏板)

有时我会收到一些错误消息,例如:

作为一个应用程序开发的新手,我完全不知道我的代码有什么问题,是某个线程卡住了,还是使用 javascript/html5 的网页影响了速度?

我研究了使用 webview 加载内容页面的 Flipboard 应用程序(ios7 版本),它会在用户点击任何帖子后立即响应。即使UIWebView的加载速度通常很慢,也有可能获得更快的性能。

任何建议的指南链接/我应该知道的背景知识将不胜感激。

PS: 因为另一个更好的东西WKWebView 仅在 iOS8 和更高版本中支持 (在我的应用程序中WKWebView 的加载速度与UIWebView 相同,但在HTML5 test site 处得分更高), 我仍然需要 iOS7 的 UIWebView。

【问题讨论】:

检查您的网速...或者您的网页很重...提供您要添加的网页的网址... 网页在贴里,我试了3G/Wifi/4G,速度差异很小(1-2秒) 使用 GCD 或 performselectorinbackground 将请求移动到另一个线程,...否则它会阻塞您的 UI 线程。还有一点,UIWebView 对象很重,在你的页面上加载它可能需要一些时间 UIWebView 请求不应该在主线程中,因为它来自 UIKit? 问题来自网站本身。 UIWebView is not Safari,它希望内容更轻.. 我刚刚在桌面上的 Chrome 上打开了网站,加载需要一些时间.. 尝试撕掉内容,然后加载.. 如果可能的话。 【参考方案1】:

嗯,您打印的错误的NSLocalizedDescription 说明了发生了什么:“HTTP 重定向太多。”

当您尝试访问网页时,服务器不会向您提供您尝试访问的页面,而是会回复重定向,即您应该访问的其他页面的地址。例如,访问缩短的链接通常会将您重定向到真实页面;受密码保护的网站可能会将您重定向到登录页面;或者重新设计的网站可能会将旧地址重定向到新位置。

但是,如果不仔细实施,此功能可能最终通过无限重定向锁定浏览器:例如,假设www.example.com/a 将您重定向到www.example.com/b,而www.example.com/b 将您重定向回www.example.com/a .因此,浏览器对它们将遵循的重定向数量施加了限制(通常约为 10 或 15 个)以避免陷入此类循环。

您遇到的错误意味着,出于某种原因,访问该页面会导致您的浏览器连续多次重定向 - 如此之多以至于它只是认为一定有问题并放弃了。

坐在这里没有要检查的应用程序副本,我无法告诉您这些重定向是什么,更不用说为什么要发出它们,但您至少可以使用 Safari Web Inspector 回答第一个问题。您可以在 Safari 的“开发”菜单中找到它,该菜单可以在 Safari 偏好设置中启用;该菜单中有用于检查 iOS 设备或模拟器中的网页的选项。您可能还必须在设备或模拟器的 Safari 设置中打开 Web Inspector 选项。

Web Inspector 的时间线工具可以告诉您通过哪些重定向发送。一旦你知道了这一点,你就可以弄清楚它为什么会这样做,甚至可以调整你的应用程序来解决这个问题。 (例如,您的 UIWebView 使用的用户代理字符串可能会混淆所涉及的服务器。不过,这是一个完整的猜测,所以不要假设这就是这里发生的事情。)

【讨论】:

我收到新错误:Error Domain=NSURLErrorDomain Code=-999 "操作无法完成。 NSURL 和 CFURL 使用相同的错误代码,在 CFNetworkErrors.h 中列出。 (在 Xcode 中,点击 Cmd-Shift-O 并输入“CFNetworkErrors.h”以查看该文件。)-999 是 kCFURLErrorCancelled,这只是意味着您的某事决定取消请求。 我已经删除了带有附加信息的答案...这似乎不是网页端的问题,但一些 UI 内容阻塞了线程。无论如何,感谢您的每一个建议!【参考方案2】:

在后台使用 performselector 移动请求,否则它会阻塞您的 UI 线程。还有一点,UIWebView对象比较重,

【讨论】:

请您为我们澄清一下您的意思?特别是声明"UIWebView object is heavy"?它有重量吗?此外,分享好东西总是好的,而不仅仅是留下看起来像评论的东西

以上是关于iOS UIWebView loadRequest 耗时太长的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 不使用 loadRequest 加载网站的移动版本

如果从 tableView:didSelectRowAtIndexPath 调用 UIWebView 不调用 loadRequest:

UIWebview loadRequest不仅适用于iPhone X.

iOS开发之UIWebView

UIWebview loadRequest 仅在 iPhone X 中不起作用

General-Block 56, 1024, 8, 244, 24 Memory Leaks using UIWebView loadRequest