如果找到我的位置需要太长时间,发送相关网址并解析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];
}
感谢您的帮助。
答案 0 :(得分:0)
调用performSelector:withObject:afterDelay:
你要求运行循环稍后调用选择器。但是[xmlParser parse]
会阻止运行循环,所以它没有机会叫你选择器。
abortParsing
旨在在解析器的委托方法中调用。
解决方法可以在单独的线程中解析。
答案 1 :(得分:0)
在我的performSelector中找到它 - 只是额外的“:”:@ selector(parsingDidTimeout :)! 我认为这与第二个线程有点奇怪。只是语法。
感谢您解释阻止运行循环的解析。我希望不需要另一个线程,但你的建议解决了我的问题。感谢。