2012-05-11 57 views
2

我試圖呈現在後臺網頁和我遇到了以下的麻煩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 

我理解的WebKit類不是線程安全的,但他們也必須始終從主線程中使用?或者,我可以創建一個虛擬web視圖來初始化webkit,然後使用後臺線程中的webkit類?

+0

看起來沒有。 http://stackoverflow.com/questions/4660999/create-a-uiimage-by-rendering-uiwebview-on-a-background-thread-iphone – Jeremy1026

+0

@ Jeremy1026該帖子關注UIWebView,而不是WebView。 –

+0

WebViews異步加載。你希望通過將其轉移到後臺線程獲得什麼? –

回答

3

WebViewNSView的子類。來自Threading Programming Guide

NSView類通常是線程安全的,但有一些例外。 您 應僅在應用程序的主線程上創建,銷燬,調整大小,移動和執行其他操作。從輔助線程繪製 是線程安全的,只要您調用lockFocusIfCanDraw和unlockFocus調用即可調用 調用。

(着重號。)

我就如何了AppKit WebView作品不太清楚,但我的理解是,在UIKit中有真的只有一個UIWebView剛剛得到重用遍佈性能方面的原因,類似於AppKit中的字段編輯器。如果我的理解是正確的,並且WebView的行爲相似,我可以看到你在後臺線程中遇到了更大的問題。

+0

是的,看起來像在後臺執行webkit工作最好是在一個單獨的過程中完成,而不是單獨的一個線程。你知道是否可以預先加載網頁而不在後臺渲染?這樣,人們可以擁有一個單一的Web視圖來執行渲染,但網絡請求仍然可以併發。 – Tony

+0

說實話,我沒有用AppKit WebView實踐,但最壞的情況是,你可以用NSHTTPURLConnection異步下載頁面,然後用例如 - [WebFrame loadHTMLString:baseURL:]將內容加載到WebView中。 –

+0

@Tony - 您可以使用多個網頁瀏覽器,將網頁預加載到當前不可見的網頁中 - 請考慮Safari選項卡。 – CRD

相關問題