2013-05-13 3 views
2

webViewDidFinishLoad 메서드가 전체 애플리케이션을 차단하여 모든 버튼을 터치 할 수없는 것으로 나타났습니다.webViewDidFinishLoad 블록 메인 스레드

결과 페이지를 구문 분석해야 UIWebView를 처리하는 데 많은 시간이 걸릴 수 있습니다. 그렇다면 전체 응용 프로그램을 차단하지 않고 구문 분석하는 가장 좋은 방법은 무엇입니까? 다른 스레드를 만들 수 있습니까? GCD를 사용하여 백그라운드에서

답변

3

구문 분석을 :

- (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 : 주 스레드 또는 웹 스레드 이외의 스레드에서 웹 잠금을 얻으려고 시도했습니다. 이것은 보조 스레드에서 UIKit을 호출 한 결과 일 수 있습니다. 지금 충돌 중 ... – FrozenHeart

+0

@NikitaTrophimov 메인 스레드에서 내용을 가져온 다음 백그라운드에서 해당 내용을 구문 분석합니다. 내 편집을 참조하십시오. – trojanfoe

+0

다음 작업을 수행합니다. http://pastie.org/7902111 같은 오류 – FrozenHeart

0

그것은 -webViewDidFinishLoad 정상은 주 스레드에서 호출 할 수 있습니다. 당신이해야 할 일은 html을 가져 와서 다른 큐로 파싱하여 구문 분석 작업을 수행하는 것입니다.

+0

백그라운드에서 stringByEvaluatingJavaScriptFromString을 호출 할 수 있습니까? 제 경우에는 그것이 오랜 시간이 걸리는 과정이며, 5 초 이상 걸리는 경우, 그것을 죽이고 다른 것을하고 싶습니다. –