2013-05-13 6 views
2

Я только заметил, что метод webViewDidFinishLoad блокирует все приложение, поэтому я даже не могу коснуться каких-либо кнопок.webViewDidFinishLoad блокирует основную нить

Мне нужно разобрать результирующую страницу UIWebView, и это может занять много времени. Так что лучший способ разобрать его, не блокируя целое приложение? Может быть, создать другой поток?

ответ

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 секунд я хотел бы убить его и сделать что-то еще. –

Смежные вопросы