2010-12-03 3 views
1

ビデオタイトルと日付などのYouTubeデータを表示するUITableViewがあります。また、UITableViewCellごとにUIWebView(75x75px)が表示され、HTML文字列が読み込まれます。UIWebViewブロッキングスレッドを使用しているYouTube UITableViewセル

UIWebView *iconView = (UIWebView*)[cell.contentView viewWithTag:2]; 
[self embedYouTube:videoUrl frame:CGRectMake(0, 0, 75, 75) webView:iconView]; 

embedYouTube機能::

I LO:

- (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

問題であり、ここで

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathのための適切なコードです私のYouTubeビューでは、これらのオブジェクトがHTMLを読み込んでいる間にメインスレッドがブロックされているようです。数秒後にすべてが期待どおりに機能しています。私はこの遅れが最初にアプリケーションをインストールした後にのみ発生することに気付きます。他のすべてのアプリケーション/ビューの起動はうまく動作します。

なぜこの「遅延」またはスレッドブロックが発生していますか?

どうすればよいですか?

答えて

-7

すべてのネットワークアクセスは、メインスレッドで行われません。 非同期APIを使用してコンテンツを読み込みます。それと同時に、単純なプレースホルダimage/local-webviewを表示してください。

+0

..私はきちんとウル質問を理解しているし、これはuの少しを助けることができる願っています。 –

+0

コードが同期呼び出しを実行していません。右。しかし、私は内部オブジェクトが同期して読み込まれると思います。 もちろんこれがチェックされます。 UIWebViewデリゲートを使用してロードが開始されているかどうかを調べることができます。 –

3

まず、これはではありません。メインスレッドでネットワークアクセスが原因で問題が発生しています(少なくとも、管理しているネットワークアクセスはありません)。メインスレッドで呼び出されるUIWebViewメソッドは、loadHTMLString:baseURL:であり、指定された文字列をHTMLビューとしてWebビューに埋め込みます。指定されたHTML文字列の内容は、YouTubeへのネットワークリクエストを意味しますが、Webビューのリンクをクリックするだけでは、メインスレッドでユーザーが開始したネットワークリクエストは作成されません。

バックグラウンドスレッドでこの操作を実行すると、間違いが発生し、クラッシュする可能性がほとんどあります。メインビューには、Webビューとのやりとりが必要です。 iOSはバックグラウンドスレッドでWebビューをインスタンス化する場合でもクラッシュエラーを発生させます。

残念なことに、ここで擦れがあります。この遅れについては何もできません。 UIWebViewが指定されたHTML内の<embed>タグを見て、そのコンテンツがYouTubeからのものであると判断した場合、YouTubeプレーヤプロセスを起動して動画を再生します。この遅れは、ネイティブプレーヤーが開始するまでの時間、ネイティブプレーヤーがYouTubeに連絡したことが原因である可能性があります。ネイティブプレーヤーの地下に住むノームが原因の可能性があります。私は原因を知らないし、ネイティブプレーヤーが完全に不透明なプロセス(デバイスをjailbreakingし、いくつかのライブラリをdisassemblerに持っていくのには不足している)から、私は見つけ出すための良い提案はない。あなたが見つけたとしても、あなたはそれについてほとんど何もできません。

私はこれが満足のいく回答ではないことを感謝します。私が間違っていることを誰かが証明してくれることを嬉しく思います。

+0

'baseUrl'に有効なURL文字列を含めると、読み込みがはるかに高速になることに気付きました。したがって、[webView loadHTMLString:html baseURL:nil];の代わりに、[webView loadHTMLString:html baseURL:[NSURL URLWithString:@ "http://google.com/"]]; ' – binnyb

0

私はこれについてはわかりませんが、私はそれがこの回答を投稿すると思いました

動画プレーヤーで動画の処理が停止したときに「webviewDidLoad」が呼び出されたかどうかを調べて調べることができます。

「webviewDidload」が呼び出されるまで他のものを取り組んでいることが本当に必要な場合はネイティブプレーヤーが動画を処理しなくなります。動画が読み込まれるまで白い輪が回転して表示されますwebview。

私は私が私の答えで述べたように、問題のコードは、メインスレッド上で同期ネットワーク要求を実行しません

+1

loadHTMLString:baseURL :メソッドは非同期ではないため、デリゲートコールバックを開始しません。さらに重要なのは、HTMLのコンテンツをロードするWebビューと、HTMLの要素によって開始される関連する要求との間に重要な違いがあることです。 Webビューは、ドキュメント本体を取得したときにwebViewDidFinishLoad:delegateメソッドを呼び出します。これは、レンダラーがそれを終了したこと、JavaScriptまたはCSSが完全に解釈されたこと、または参照されたコンテンツ(画像など)がダウンロードされたことを意味するものではありません。 –

関連する問題