2012-02-17 65 views
1

我開發一個iPhone應用程序,並有一些麻煩我的XML解析器。我必須從多個XML文件中檢查多個值,但是當XML解析器處於活動狀態時,我無法執行其他任何操作。這不是我想要的,因爲檢查xml必須在後臺完成,而不被注意。這裏是我的一些代碼,希望已經足夠了!XML解析器的Xcode很慢

appDelegate.datavalues = [[NSMutableArray alloc] init]; 
for(int i = 0; i < [headarray count]; i++){ 
    NSMutableArray *infoarray = [[NSMutableArray alloc]initWithArray:[headarray objectAtIndex:i]]; 
    NSString *IP = [infoarray objectAtIndex:1]; 
    NSString *Unique = [infoarray objectAtIndex:2]; 
    NSString *Port = [infoarray objectAtIndex:3]; 
    NSString *relay = (NSString *)[infoarray objectAtIndex:4]; 
    NSString *input = (NSString *)[infoarray objectAtIndex:5]; 
    NSLog(@"relay%@",relay); 
    NSString *urlAddress = [NSString stringWithFormat:@"http://%@:%@/state.xml",IP,Port]; 
    NSURL *url = [NSURL URLWithString:urlAddress]; 
    NSString *authHeader = [NSString stringWithFormat:@"Basic %@",Unique]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                  cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval: 3]; 
    [request setValue:authHeader forHTTPHeaderField:@"Authorization"]; 
    //NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    NSURLResponse *myURLResponse; 
    NSError *myError; 

    NSData* myDataResult = [NSURLConnection sendSynchronousRequest: request returningResponse:&myURLResponse error:&myError]; 


    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:myDataResult]; 
    XMLParser *parser = [[XMLParser alloc] initXMLParser]; 
    //parser.relay = [infoarray objectAtIndex:4]; 
    //Set delegate 
    [xmlParser setDelegate:parser]; 
    //Start parsing the XML file. 
    BOOL success = [xmlParser parse]; 

在此之後我查了一些價值,所以我不認爲這是必要的,以顯示!

回答

0

有一個看的NSOperation和NSOperationQueue API和/或併發編程指南。 (兩者都在Xcode庫中)。

從文檔:

的NSOperationQueue類調節一組 的NSOperation對象的執行。被添加到隊列後,直到它被明確取消的操作 留在該隊列或完成 執行其任務。隊列內的操作(​​但尚未執行 )本身被按照優先級和 交互操作對象依賴組織,並且相應地執行。一個 應用程序可以創建多個操作隊列和提交作業 到任何人。

+0

?你知道什麼是取消的最好方式它?? – kjeldGr 2012-02-17 19:05:25

+0

設置一個標誌,當你想取消它。有你'XMLParser'檢查標誌,如果它的設置,執行'[XMLPARSER abortParsing]'。 – 2012-02-17 20:06:18

1

您可以重構XML相關的代碼放到一個單獨的方法,然後你可以使用大中央調度運行在後臺的方法:

- (void) startOperation 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{ 
     [self runSomeXMLChecks]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      // This is dispatched on the main queue so that 
      // you can update the UI. The NSLog is just an example. 
      NSLog(@"XML check done!"); 
     }); 
    }); 
}