使用UIWebView阻止线程的YouTube UITableView单元格?

时间:2010-12-03 16:26:09

标签: iphone objective-c ios uiwebview

我有一个显示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];
}

loadedIconsArrayNSMutableArray

问题:

当我加载我的YouTube视图时,似乎主要线程在这些UIWebView对象加载HTML时被阻止。几秒钟后,一切都按预期工作。我注意到,只有在第一次安装应用程序后才会遇到这种延迟。所有其他应用程序/视图启动都可以正常工作。

为什么我遇到这种“滞后”或线程阻塞?

我该如何避免呢?

3 个答案:

答案 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即可显示。