我想放入一個超時,以防萬一找到我的位置需要很長時間,發出相關的URL並解析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];
}
謝謝您的幫助。
現在我有'[self performSelector:@selector(parsingDidTimeout :) withObject:nil afterDelay:2];'然後'[self performSelectorInBackground:@selector(backgroundParse)withObject:nil]'。然後backgroundParse調用'[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(parsingDidTimeout :) object:nil];'當它成功時。現在我的問題是,當超時發生時,它調用parsingDidTimeout,我得到一個無法識別的選擇器錯誤。我目前有'\t [xmlParser abortParsing];'在parsingDidTimeout中,但即使這樣,我得到的錯誤。啊。怎麼辦?謝謝! – snorkelt 2010-10-31 19:53:01
似乎只是一個錯字。在@selector(parsingDidTimeout :)中有一個':',但該方法被聲明爲空。 – Yuras 2010-10-31 20:19:48
我從我的parsingDidTimeout方法調用[xmlParser abortParsing]。我如何從我的委託方法中調用它?這是在不同的線程,但我需要從我的主線程調用parsingDidTimeout。它仍然不會中止解析,即使alertView彈出。 – snorkelt 2010-10-31 20:32:08