2013-05-13 81 views
2

我只注意到webViewDidFinishLoad方法會阻塞整個應用程序,所以我甚至不能觸摸任何按鈕。webViewDidFinishLoad塊主線程

我需要解析UIWebView的結果頁面,它可能需要很長時間。那麼解析它而不阻塞整個應用程序的最佳方式是什麼?也許創建另一個線程?

回答

3

解析它在使用GCD背景:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // Get the contents from the UIWebView (in the main thread) 
    NSString *data = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Parse the data here 

     dispatch_sync(dispatch_get_main_queue(), ^{ 

      // Update the UI here 

     }); 
    }); 
} 
+0

bool _WebTryThreadLock(bool),0x1e507400:嘗試從主線程或Web線程以外的線程獲取Web鎖。這可能是從輔助線程調用UIKit的結果。現在崩潰... – FrozenHeart 2013-05-13 11:12:48

+0

@NikitaTrophimov獲取主線程中的內容,然後在後臺解析該內容。看我的編輯。 – trojanfoe 2013-05-13 11:14:46

+0

我執行以下操作:http://pastie.org/7902111相同的錯誤 – FrozenHeart 2013-05-13 11:25:01

0

這是正常-webViewDidFinishLoad要在主線程調用。你需要做的是獲取HTML並通過將其分派到另一個隊列來完成解析操作。

+0

我可以在後臺調用stringByEvaluatingJavaScriptFromString嗎?在我的情況下,這是一個需要很長時間的過程,如果超過5秒鐘,我想殺了它並做其他事情。 – 2015-02-08 20:39:19