2010-10-31 52 views
0

我想放入一個超時,以防萬一找到我的位置需要很長時間,發出相關的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]; 

}

謝謝您的幫助。

回答

0

調用performSelector:withObject:afterDelay:您要求運行循環稍後調用選擇器。但是[xmlParser parse]會阻止運行循環,所以它沒有機會叫你選擇器。

abortParsing被設計爲在解析器的委託方法中被調用。

解決方法可以在單獨的線程中解析。

+0

現在我有'[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

+0

似乎只是一個錯字。在@selector(parsingDidTimeout :)中有一個':',但該方法被聲明爲空。 – Yuras 2010-10-31 20:19:48

+0

我從我的parsingDidTimeout方法調用[xmlParser abortParsing]。我如何從我的委託方法中調用它?這是在不同的線程,但我需要從我的主線程調用parsingDidTimeout。它仍然不會中止解析,即使alertView彈出。 – snorkelt 2010-10-31 20:32:08

0

發現它 - 只是額外的「:」在我的performSelector:@selector(parsingDidTimeout :)! 我認爲這是與第二個線程有關的東西。只是語法。

感謝您解釋阻止運行循環的解析。我希望不需要另一個線程,但你的建議解決了我的問題。謝謝。

相關問題