2009-07-16 40 views
2

我正在構建一個應用程序,它將讀取rss提要並將它們呈現在UITableViews中。我搜索了谷歌,這裏和ai決定使用LibXML。加載和解析xml文檔在iphone中凍結我的GUI

當我的應用程序啓動時,檢查它是否有有效的互聯網連接,並抓取一個rss提要,我從中提取一些數據,然後用tableViews製作一個uiTabBar。解析第一個rss提要並構建UITabBar後,對於我的uiTabBar中的每個按鈕,我都有一個不同的rss提要(類別)。當我有一個很好的互聯網連接(wifi),甚至3G我的應用程序工作真的很好,但當互聯網連接遭受我的應用程序也是如此。

因爲我一個接一個地解析所有的feed,並且在主線程中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事件上的feed的函數。

現在我想解析他們在另一個線程不在主要..有人可以給我一些指針?

謝謝你提前

回答

1

看看NSOperation和NSOperationQueue。它們對於多線程非常有用。

基本上是NSOperation的子類,並將你的代碼寫入主要方法。然後將您的操作添加到操作隊列中,並且每個操作都將在另一個線程上運行。

您可以在操作完成時設置回調,以便將解析的數據反饋回您的視圖。

+0

它的工作原理,謝謝。 – 2009-07-16 13:30:53

4

基本問題是initWithContentsOfURL:阻塞,直到它從網上獲取數據,這可能需要幾秒鐘。如果您在應用程序的主線程中調用它,則基本上會在網絡流量期間鎖定整個應用程序。

另一種選擇是使用NSURLConnection來下拉數據。它不如initWithContentsOfURL:的單一方法調用方便,但是本質上是異步的。因此,您不必自行實現線程和回調,而只需實現幾個委託方法,然後創建NSURLConnection的實例。

有關更多信息,請參閱URL loading system的官方文檔。

0

我已經發布了一個開源的RSS/Atom Parser for iPhone,它使得閱讀和解析web feed非常容易。

您可以將其設置爲異步下載數據,也可以同步在後臺線程中運行它以收集饋送數據。這樣,當數據被解析時,你的UI將是免費的。