2013-04-23 3 views
0

멀티 스레딩을 처음 접했고 백그라운드에서이 기능을 어떻게 실행할 수 있는지 궁금합니다. 이 함수는 단순히 XML 파싱에 사용되는 NSURL을 반환하며 다른 함수에서 호출됩니다. 또는이 함수가 NSURL을 반환 할 때까지 함수를 호출하는 함수가 계속되지 않기 때문에 백그라운드에서 실행할 가치가 있습니다. 근본적으로, 나는 단지 약간의 시간을 끝내기 때문에 이것을 빠르게하는 방법을 알아 내려고 노력하고있다!백그라운드에서 iOS exec 기능

+ (NSURL *)parserURL { 

    NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"]; 
    NSData *data = [[NSData alloc] initWithContentsOfURL:theURL]; 
    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data]; 
    NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"]; 
    if (elements.count >= 1) { 

     TFHppleElement *element = [elements objectAtIndex:0]; 
     TFHppleElement *child = [element.children objectAtIndex:0]; 
     NSString *idValue = [child content]; 

     NSString *stg = [NSString stringWithFormat:@"http://www.wccca.com/PITS/xml/fire_data_%@.xml", idValue]; 
     NSURL *url = [NSURL URLWithString:stg]; 

     return url; 
    } 
    return nil; 
} 

답변

1

코드의 주된 문제는 차단 작업을 사용하여 웹 사이트에서 데이터를 가져 오는 것입니다. 당신은 분명히 배경 스레드에서 이것을 실행하고 싶습니다. 그러나 이러한 종류의 작업을 매우 쉽게 수행하는 데 도움이되는 네트워킹 프레임 워크를 살펴볼 것을 권합니다. 즉, AFNetworking,

어떤 경우에도 해당 작업을 다중 스레드로 수행 할 때 사용하는 전략 또는 이와 유사한 하나는 다음과 같습니다. GDC으로 디스 패칭 한 다음 메인 스레드에서 수신 완료 블록을 다시 실행하여 결과를 얻습니다.

설명 블록을받을 함수를 선언하여

먼저 시작 : 여기

는 코드입니다. 블록 검색은 데이터 검색 및 구문 분석이 끝나면 끝나면 실행됩니다. 다음 코드는 GDC가 백그라운드 큐에서 코드 블록을 실행하도록 요청합니다. 이 작업이 끝나면 주 스레드에서 함수의 매개 변수로 제공된 완료 블록을 실행하도록 코드에 요청하여 구문 분석 된 문자열을 제공합니다.

[URLParser parserURL:[NSURL URLWithString:@"http://www.wccca.com/PITS/"] completion:^(NSURL *finalURL) { 
     NSLog(@"Parsed string %@", [finalURL absoluteString]); 
    }]; 
+0

최고 감사 :

+(void) parserURL:(NSURL *) theURL completion:(void (^) (NSURL *finalURL))completionBlock{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [[NSData alloc] initWithContentsOfURL:theURL]; TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data]; NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"]; NSURL *url; if (elements.count >= 1) { TFHppleElement *element = [elements objectAtIndex:0]; TFHppleElement *child = [element.children objectAtIndex:0]; NSString *idValue = [child content]; NSString *stg = [NSString stringWithFormat:@"http://www.wccca.com/PITS/xml/fire_data_%@.xml", idValue]; url = [NSURL URLWithString:stg]; }else{ url = nil; } dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(url); }); }); 

}

당신은 방법을 다음과 같은 방법을 호출합니다. 이미 파싱 작업을 위해 AFNetworking을 사용하고 있습니다. 이 코드 블록은 AFNetwokring XML 작업에 대한 링크를 만드는 데 사용되는 URL을 반환합니다. –

+0

AFNetworking을 사용하여 데이터를 가져올 수도 있습니다. '([끔찍하지는 않지만)] [[NSData 할당] initWithContentsOfURL : theURL]; –

+0

완료시 선언되지 않은 식별자 'url'을 사용합니다. –