2014-09-01 4 views
0

Я не могу сделать кнопку back (предыдущая страница в навигации), работая во время процесса анализа html. То, что я пытаюсь сделать, это разбор html и получение pdf-файла на viewDidAppear. В течение этого времени я хочу, чтобы кнопка back была включена, потому что синтаксический анализ может занять много времени. Поэтому пользователи могут решить оставить процесс разбора.Нажатие кнопки не работает во время разбора

вот мой код:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [self performSelector:@selector(getPDFUrl) withObject:nil afterDelay:0]; 
} 

-(void) getPDFUrl 
{ 
    NSURL *programURL = [NSURL URLWithString:@"http://www.example.com/somepdf/"]; 
    NSData *programHtmlData; 
    @try 
    { 
     programHtmlData = [NSData dataWithContentsOfURL:programURL]; 
    } 
    @catch(NSException* ex) 
    {} 
    // 2 
    TFHpple *programHTMLParser = [TFHpple hppleWithHTMLData:programHtmlData]; 

    NSString *studiosXpathQueryString = 
    @"//div[@class='ultra_wrapper']/div[@class='container columns extra_pad boxed_lay centered']/div[@id='prk_ajax_container']/div[@id='centered_block']/div[@id='main_block']/div[@id='content']/div[@id='main']/div[@class='twelve columns sidebarized']/div[@class='prk_no_composer']/p/a"; 
    NSArray *programNodes = [programHTMLParser searchWithXPathQuery:studiosXpathQueryString]; 
    NSMutableArray *activities = [[NSMutableArray alloc] init]; 
    Tutorial *tutorial; 

    if (programNodes.count > 0) { 

     for (TFHppleElement *element in programNodes) 
     { 

      @try 
      { 
       tutorial = [[Tutorial alloc] init]; 
       tutorial.url = [element objectForKey:@"href"]; 
      } 
      @catch(NSException* ex) 
      { 

      } 
     } 

     NSURL *targetURL = [NSURL URLWithString:tutorial.url]; 
     webView.scalesPageToFit=YES; 
     NSURLRequest *request = [NSURLRequest requestWithURL:targetURL]; 
     [webView loadRequest:request]; 
    } 
    else 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"warning" 
                 message:@"warning!" 
                 delegate:self 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 
+0

Возможно, вы заблокировали основной поток, который должен соответствовать пользовательскому интерфейсу. Вам нужно заставить синтаксический анализатор работать в фоновом режиме, поэтому взгляните на 'performSelectorInBackground: withObject:' (https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/ reference.html # // apple_ref/occ/instm/NSObject/performSelectorInBackground: withObject :) – Popeye

ответ

4
[self performSelector:@selector(getPDFUrl) withObject:nil afterDelay:0]; 

будет выполняться на главном потоке. Поэтому блокировка вашего пользовательского интерфейса.

Вы должны использовать

[self performSelectorInBackground:@selector(getPDFUrl) withObject:nil]; 

Или вы можете использовать NSOperationQueue или просто NSOperation или более простой способ NSBlockOperation.

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ 

    NSLog(@"dasds"); 

}]; 

[op start]; 
+0

Да, такая ошибка. Большое спасибо, он работает сейчас. – birdcage

+0

Рад, что это помогло. @gbesler –

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