2012-05-11 11 views
2

私はバックグラウンドでウェブページをレンダリングしようとしていると私はWebKitのクラスはスレッドセーフではないことを理解し、彼らはまた、常にメインスレッドから使​​用しなければならない、次のトラブルWebkitは常にメインスレッドで使用する必要がありますか?

2012-05-11 12:39:02.086 [77207:1c03] An uncaught exception was raised 
2012-05-11 12:39:02.087 [77207:1c03] objc_object* -[WebView initWithFrame:frameName:groupName:](WebView*, objc_selector*, CGRect, NSString*, NSString*) was called from a secondary thread 

に走りました?また、ダミーWebビューを作成してWebkitを初期化し、後でバックグラウンドスレッドのWebkitクラスを使用することはできますか?

+0

いいえのように見えます。 http://stackoverflow.com/questions/4660999/create-a-uiimage-by-rendering-uiwebview-on-a-background-thread-iphone – Jeremy1026

+0

@ Jeremy1026その投稿は、WebViewではなくUIWebViewに関するものです。 –

+0

WebViewsが非同期に読み込まれます。それをバックグラウンドスレッドに移すことで、何を得ることを望んでいますか? –

答えて

3

WebViewは、NSViewのサブクラスです。 Threading Programming Guideから:

NSViewクラスは、一般にスレッドセーフですが、例外はありますが、 NSViewオブジェクトは、アプリケーションのメインスレッドからのみ作成、破棄、サイズ変更、移動、その他の操作を実行する必要があります。 の呼び出しをlockFocusIfCanDrawおよびunlockFocusの呼び出しで囲む限り、セカンダリスレッドからの描画 はスレッドセーフです。

(強調は追加。)

私はどのようにAppKitのWebView作品にはあまり明確なんだけど、私の理解では、UIKitの中だけで、パフォーマンス上の理由から、すべての上に再利用されますのみ1 UIWebViewが本当に存在することです、 AppKitのフィールドエディタに似ています。私の理解が正しいならば、WebViewも同様に振る舞い、バックグラウンドスレッディングに関するさらに大きな問題があることが分かりました。

+0

さて、バックグラウンドでWebkitの作業を行うのは、別のスレッドではなく別のプロセスで行うのが最適です。バックグラウンドでレンダリングせずにWebページをプリロードすることが可能かどうかは分かりますか?こうすることで、レンダリングを行う単一のWebビューを持つことができますが、ネットワーク要求は同時に実行できます。 – Tony

+0

正直言って私はAppKit WebViewで練習しているわけではありませんが、最悪の場合NSHTTPURLConnectionで非同期にページをダウンロードし、コンテンツをWebViewに読み込みます。たとえば、 - [WebFrame loadHTMLString:baseURL:]。 –

+0

@トニー - 複数のウェブビューを使用して、現在表示されていないページにページをプリロードすることができます。 – CRD

関連する問題