Мой таймер не останавливает мой анализ - PullRequest
0 голосов
/ 31 октября 2010

Я хочу ввести тайм-аут на тот случай, если потребуется слишком много времени, чтобы найти мое местоположение, отправить соответствующий URL-адрес и проанализировать xml. Это работало, когда я использовал executeSelector: withObject: afterDelay в locationManager (просто для проверки получения xml), но когда я помещал подобный код в свой анализатор, он фактически не прерывал синтаксический анализ. Я проверяю это, снизив задержку до 0,01.

Моя проблема: даже с задержкой, установленной на 0,01, он все еще ждет, пока все синтаксический анализ завершится первым, и только затем он создает alertView, закодированный в методе parsingDidTimeout.

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

Я создаю URL, который требует радиуса. Сначала я пробую маленький радиус, но если я не получаю нужные мне данные, я расширяю радиус и снова отправляю URL и снова разбираю. Вот часть моего метода StartParsing.

 xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
 XMLParser *parser = [[XMLParser alloc] initXMLParser];
[xmlParser setDelegate:parser];

 if (!hadToExpandRadius){//meaning, only do this the first time I send out the url and parse
 [self performSelector:@selector(parsingDidTimeout:) withObject:nil afterDelay:0.01];
 }
 //Start parsing the XML file.
 BOOL success = [xmlParser parse];

 if(success){
 if((didNotGetTheDataYet) && (radius < 500)){
 hadToExpandRadius = YES;
 radius = radius + 35;
 [self startParsing];//do this same method, with larger radius
 }
 else {
 NSLog(@"No Errors");
 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(parsingDidTimeout:) object:nil];}
 [parser release];
 }

 -(void)parsingDidTimeout{
       [xmlParser abortParsing];
  UIAlertView *servicesDisabledAlert = [[UIAlertView alloc] initWithTitle:@"Try Later" message:@"We need a better connection. We can get the data later." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  [servicesDisabledAlert show];
  [servicesDisabledAlert release];
  [myActivityView stopAnimating];

}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 31 октября 2010

Нашел его - просто дополнительные ":" в моем executeSelector: @selector (parsingDidTimeout :)! Я думал, что это было что-то необычное, связанное со вторым потоком. Просто синтаксис.

Спасибо за объяснение о разборе, блокирующем цикл выполнения. Я надеялся, что вам не понадобится другая ветка, но ваше предложение устранило мою проблему. Спасибо.

0 голосов
/ 31 октября 2010

При вызове performSelector:withObject:afterDelay: вы просите цикл выполнения позже вызвать селектор.Но [xmlParser parse] блокирует цикл выполнения, поэтому у него нет возможности вызвать ваш селектор.

abortParsing предназначен для вызова внутри методов делегата синтаксического анализатора.

Обходной путьможно разобрать в отдельном потоке.

...