2012-02-17 3 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

+0

취소하려는 경우 플래그를 설정하십시오. 'XMLParser'가 플래그를 검사하도록하고, 설정되어 있다면'[xmlParser abortParsing]'을 실행하십시오. –

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!"); 
     }); 
    }); 
}