重复使用UIWebView会导致崩溃。

6
我看到有人说重复使用UIWebView是一种不好的做法。我在工作中继承了一些代码,它将各种内容推送到UIWebView中,包括Powerpoints、Word文档和视频。在正常情况下,这都可以正常运行。当我们过快地切换UIWebView中的内容时,它就会崩溃。
我的webView被设置为一个属性,并且在IB中已经成功连接。从我们的tableView中正常选择加载本地内容。只有在快速连续选择同一个单元格或多个单元格时,它才会崩溃。
我可以捕获一些错误消息,例如webViewDidFailWithError。但即使没有崩溃,这些也会触发。下面是错误的本地化字符串。
The operation couldn’t be completed. (NSURLErrorDomain error -999.)

当应用程序最终崩溃时,会出现这个怪异的 WebCore 错误。
如果有人有链接或一些代码示例如何处理这个错误,我将不胜感激。也许有一个示例可以最好地重复使用我的 webView 属性而不会炸毁它。
我想加载一些代码,但有很多与 webView 本身无关的代码在运行。所有推送到 webView 的内容都是通过 [self.webView loadRequest:request]; 加载的,其中请求是填充有本地内容路径的 NSURLRequest。
如果有人能帮助我解决这个问题,我将非常感激。希望能找到简单的解决方法。

也许你应该在 webView 加载请求时阻止用户交互。 - Roman Temchenko
可能有这种可能性,但不确定我们的客户是否会接受。 我会考虑这个建议。谢谢。 - Bill Burgess
你尝试过使用@try {} @catch {}吗? - ott--
UIWebView只能在主线程上处理,这是正确的做法吗? - Danra
5个回答

2

我不确定这种方法是解决问题的“最佳”方式,但它似乎运行得非常好。简短、简洁且有效。

我禁用了更新webView内容的tableView的userInteraction。由于你必须频繁地点击它,偶尔错过一次点击可能不会被注意到。所以目前,这是解决方法。

#pragma mark -
#pragma mark UIWebViewDelegate methods

-(void)webViewDidStartLoad:(UIWebView *)webView {
    [self.tableView setUserInteractionEnabled:NO];
}

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.tableView setUserInteractionEnabled:YES];
}

// I re-enable on load failures as they can block you out entirely on fail
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    [self.tableView setUserInteractionEnabled:YES]; 
}

1
如果只有在快速点击时才会崩溃,你可以尝试添加一个手势识别器来充当简易的速率限制器吗?

tableView上的手势识别器 -didSelectRowAtIndexPath? - Bill Burgess
在触发请求的任何视图上,确保不要过于频繁地发送它们。 - Ellen Teapot

0
你是否在加载新请求之前使用了[webview stopLoading];?你可能需要在尝试加载不同的请求之前取消或停止当前的加载。另一个选择是限制用户输入。

我已经尝试在调用新的loadRequest之前放置[self.webView stopLoading];,但是它没有任何区别,仍然崩溃。 - Bill Burgess
听起来问题就在那个区域内。如果只有在快速点击时才会崩溃,那么问题肯定与多个请求有关。至于限制用户输入,不必等到加载完成才进行。你可以尝试忽略半秒或一整秒的触摸操作,看看是否能解决问题。 - Jaybit
是的,我确信这可以解决问题。但这并不能真正解决问题。我可以快速地加强它,它能够支撑住。只有在过度敲击时才会导致崩溃。如果可能的话,我的工作要求我找出如何防止崩溃。感谢您的见解。 - Bill Burgess
这里有更多的信息。我创建了一个带有webView的项目,并创建了两个按钮,可以在两个不同的请求之间切换。我尽可能快地点击了它们,甚至同时点击,但它从未崩溃。我在模拟器和设备上都进行了测试。 - Jaybit
我们正在设备上加载保存的内容。Word文档、PDF文件、Powerpoints幻灯片。我在两个.pptx文件之间来回切换。感谢你的努力。我可以点击同一个按钮反复重新加载同一个文件。但如果我操作得足够快,它最终会崩溃。 - Bill Burgess
我在一个新项目中尝试了同样的事情,结果它崩溃了。这里是我的加载 webview 的代码行。 [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"file1" ofType:@"ppt"]isDirectory:NO]]]; - Bill Burgess

0
在你的UIWebViewDelegate中,你可以实现webView:shouldStartLoadWithRequest:navigationType:方法,如果已经有一个请求正在加载,则返回NO

0

我不禁想到,您最好不要重复使用UIWebView。放弃nib,在程序中创建它并将其设置为nil,当数据源改变时重新创建/重新分配/重新分配它。

另外,我建议您确保使用NSOperationQueue进行数据加载。


谢谢你的建议。不幸的是,这件事情我手头有些束缚。我们确实想出了一个解决办法。我们正在创建一个带有进度指示器的UIView,显示它仍在加载并防止用户过载Web视图。它起作用了,客户很满意,这就是我所能希望的。感谢你的建议。 - Bill Burgess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接