2

バックグラウンドで Web ページをレンダリングしようとしているのですが、次のような問題が発生しました。

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

Webkit クラスがスレッドセーフでないことは理解していますが、常にメイン スレッドから使​​用する必要がありますか? あるいは、ダミーの Web ビューを作成して Webkit を初期化し、後でバックグラウンド スレッドから Webkit クラスを使用することはできますか?

4

1 に答える 1

3

WebViewのサブクラスですNSViewスレッディングプログラミングガイドから:

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

(強調を追加しました。)

AppKit がどのように機能するかについてはあまり明確ではありませWebViewんが、UIKit にはUIWebView、パフォーマンス上の理由から、AppKit のフィールド エディターに似たものだけが実際に再利用される 1 つしかないということを理解しています。私の理解が正しく、WebView同様に動作する場合、バックグラウンド スレッドでさらに大きな問題が発生していることがわかります。

于 2012-05-11T17:03:15.123 に答える