我的计时器没有停止我的解析

时间:2010-10-31 16:05:17

标签: objective-c timer nsxmlparser uialertview xml-parsing

如果找到我的位置需要太长时间,发送相关网址并解析xml,我想暂停。当我在locationManager中使用performSelector:withObject:afterDelay(只是为了测试获取xml)时,它工作正常,但是当我在解析器周围放置类似的代码时,它实际上并没有中止解析。我通过将延迟降低到0.01来测试这个。

我的问题是:即使将延迟设置为0.01,它仍然等待所有解析首先完成,然后它才会提出在parsingDidTimeout方法中编码的alertView。

我确实尝试过这个计时器,并且这与我的代码的其他部分中的performSelector不一样。无论哪种方式,它都不会提出alertView,并且在解析完成之后停止解析,无论需要多长时间。

我创建了一个需要半径的网址。首先我尝试一个小半径,但如果我没有得到我需要的数据,我扩展半径并再次发送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 :(得分:0)

调用performSelector:withObject:afterDelay:你要求运行循环稍后调用选择器。但是[xmlParser parse]会阻止运行循环,所以它没有机会叫你选择器。

abortParsing旨在在解析器的委托方法中调用。

解决方法可以在单独的线程中解析。

答案 1 :(得分:0)

在我的performSelector中找到它 - 只是额外的“:”:@ selector(parsingDidTimeout :)! 我认为这与第二个线程有点奇怪。只是语法。

感谢您解释阻止运行循环的解析。我希望不需要另一个线程,但你的建议解决了我的问题。感谢。