我有一个显示YouTube数据的UITableView
,例如视频标题和日期。我还为每个加载HTML字符串的UIWebView
显示UITableViewCell
(75x75px)。
这是- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
的相关代码:
UIWebView *iconView = (UIWebView*)[cell.contentView viewWithTag:2];
[self embedYouTube:videoUrl frame:CGRectMake(0, 0, 75, 75) webView:iconView];
和embedYouTube
函数:
- (void)embedYouTube:(NSString*)url frame:(CGRect)frame webView:(UIWebView*)webView {
if([loadedIconsArray containsObject:webView])
return;
NSString *youTubeVideoHTML = @"<html><head>\
<body style=\"margin:0\">\
<embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
width=\"%0.0f\" height=\"%0.0f\"></embed>\
</body></html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, url, frame.size.width, frame.size.height];
[webView loadHTMLString:html baseURL:nil];
[loadedIconsArray addObject:webView];
}
loadedIconsArray
是NSMutableArray
问题:
当我加载我的YouTube视图时,似乎主要线程在这些UIWebView
对象加载HTML时被阻止。几秒钟后,一切都按预期工作。我注意到,只有在第一次安装应用程序后才会遇到这种延迟。所有其他应用程序/视图启动都可以正常工作。
为什么我遇到这种“滞后”或线程阻塞?
我该如何避免呢?
答案 0 :(得分:3)
首先,这是不由主线程上的网络访问引起的问题(至少没有您可以控制的任何网络访问)。在主线程上调用的UIWebView方法是loadHTMLString:baseURL:,它只是将指定的字符串作为HTML内容填充到Web视图中。指定的HTML字符串的内容意味着向YouTube发送网络请求,但这不会在主线程上创建用户发起的网络请求,只需单击Web视图中的链接即可。
任何在后台线程中执行此操作的建议都是错误的,几乎肯定会导致崩溃。与Web视图的任何交互都应该在主线程中;即使在后台线程上实例化Web视图,iOS也会出现崩溃错误。
不幸的是,这就是问题所在,对于这种滞后,你可能无能为力。当UIWebView在指定的HTML中看到<embed>
标记并确定该内容是来自YouTube时,它会启动原生YouTube播放器进程来播放视频。滞后可能是由本机玩家开始的时间引起的,可能是由本地玩家联系YouTube造成的,可能是由居住在本地玩家地下室的侏儒造成的。我不知道原因,因为原生播放器是一个完全不透明的过程(没有越狱设备和一些带有反汇编程序的图书馆)我没有一个很好的建议如何找出答案。即使你确实发现了,但几乎可以肯定你无能为力。
我很欣赏这是一个令人不满意的答案,我很高兴有人证明我错了。
答案 1 :(得分:0)
我不确定这一点,但我认为这可能对你有所帮助,所以想发布这个答案......
你可以检查一下,当视频播放器停止处理视频时,是否会调用“webviewDidLoad
”。
如果它确实调用了我建议做的事情就是解决其他问题,直到调用“webviewDidload”,即本机播放器停止处理视频,就像youtube提供一个旋转的白色轮子,直到它加载视频,然后显示webview
我希望我能正确理解你的问题,这可能对你有所帮助..
答案 2 :(得分:-7)
任何网络访问都不应在主线程上完成。 使用异步API加载内容。在此期间,只需提供一个简单的占位符图像/ local-webview即可显示。