2009-07-16 4 views
2

저는 rss 피드를 읽고 UITableViews로 제공 할 앱을 만들고 있습니다. 나는 Google에서 검색했으며 여기에서 AI는 LibXML을 사용하기로 결정했습니다.XML 문서를로드하고 구문 분석하면 아이폰에 GUI가 생깁니다.

내 앱이 시작될 때 앱이 인터넷에 연결되어 있는지 확인하고 일부 데이터를 추출하는 RSS 피드를 가져 와서 tableViews로 uiTabBar를 만듭니다. 첫 번째 RSS 피드를 구문 분석하고 UITabBar을 만든 후에 uuTabBar의 각 버튼에 대해 다른 RSS 피드 (카테고리)가 있습니다. 내가 좋은 인터넷 연결 (와이파이) 및 심지어 3G 내 애플 리케이션이 정말 좋은 작동하지만 인터넷 연결이 내 애플 리케이션을 겪을 때.

나는 모든 피드를 하나씩 파싱하고 메인 스레드에서 GUI가 응답하지 않고 문제가되기 때문에. 내 피드를 구문 분석 LibXML을 사용

, 내가 이런 식으로 작업을 수행합니다

CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease]; 

NSArray *resultDate = NULL; 
resultDate = [rssParser nodesForXPath:@"//channel" error:nil]; 

for(CXMLElement *date in resultDate) 
{ 
    NSString *data = (NSString *)[[date childAtIndex:12] stringValue]; 
    [self setLastBuildDate:[[self parseDate:data] copy]]; 
    break; 
} 

NSArray *resultNodes = NULL; 
resultNodes = [rssParser nodesForXPath:@"//item" error:nil]; 

for(CXMLElement *resultElement in resultNodes) 
{ 
    NSMutableDictionary *feed = [[NSMutableDictionary alloc] init]; 
    int counter; 

    for(counter = 0; counter < [resultElement childCount]; counter++) 
    { 
     [feed setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]]; 
    } 
    [links addObject:[feed objectForKey:@"link"]]; 
    [feedsList addObject:[feed copy]]; 
    [feed release]; 
} 
[newsTable reloadData]; 

나는 내가의 UITabBar의 버튼을 누르면 첫 번째 버튼의 공급 및 다른 사람을 구문 분석을 시도하지만 난 -didselectitem 이벤트에서 피드를 잡고 파싱하는 함수를 호출 할 수 없습니다.

이제 다른 하나의 스레드에서 파싱을 생각하고있었습니다 ... 누군가가 내게 포인터를 줄 수 있습니까?

미리 감사드립니다.

답변

1

NSOperation 및 NSOperationQueue를 살펴보십시오. 그것들은 멀티 스레딩에 매우 유용합니다.

기본적으로 NSOperation을 서브 클래스 화하고 main 메소드에 코드를 작성하십시오. 그런 다음 작업을 작업 대기열에 추가하면 각 작업이 다른 스레드에서 실행됩니다.

작업이 완료되면 콜백을 설정하여 구문 분석 된 데이터를 뷰에 다시 제공 할 수 있습니다.

+0

작동합니다. 감사합니다. –

4

기본 문제는 웹에서 데이터를 가져올 때까지 initWithContentsOfURL: 블록이되므로 초가 걸릴 수 있습니다. 앱의 메인 스레드에서 호출하면 기본적으로 네트워크 트래픽 지속 시간 동안 전체 앱을 잠급니다.

또 다른 옵션은 NSURLConnection을 사용하여 데이터를 내리는 것입니다. 단일 메서드 호출 initWithContentsOfURL:처럼 편리하지는 않지만 본질적으로 비동기입니다. 따라서 스레딩과 콜백을 직접 구현하지 않고 두 가지 대리 메서드를 구현 한 다음 NSURLConnection의 인스턴스를 만듭니다.

자세한 내용은 URL loading system의 공식 설명서를 참조하십시오.

0

나는 오픈 소스 RSS/Atom Parser for iPhone을 공개했으며 웹 피드 읽기 및 구문 분석을 매우 쉽게 만들어줍니다.

데이터를 비동기 적으로 다운로드하도록 설정하거나 백그라운드 스레드에서 동시에 실행하여 피드 데이터를 수집 할 수 있습니다. 그렇게하면 데이터가 파싱되는 동안 UI는 무료가됩니다.