2009-07-16 5 views
2

rssフィードを読み込んでUITableViewsで表示するアプリケーションを構築しています。私はGoogleで検索し、ここでAIはLibXMLを使用することに決めました。XML文書を読み込んで解析すると、自分のGUIがフリーズする

私のアプリが起動すると、有効なインターネット接続があるかどうかをチェックし、rssフィードを取得してデータを抽出し、tableViewsでuiTabBarを作成します。最初のRSSフィードを解析してUITabBarを構築した後、私のuiTabBarの各ボタンには別のrssフィード(カテゴリ)があります。私は良いインターネット接続(無線LAN)と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イベントでフィードを取得して解析する関数を呼び出すことはできません。

今、私は主なものではない別のスレッドでそれらを解析することを考えていた。誰かが私にいくつかのポインタを与えることができますか?

はNSOperationとNSOperationQueueに見て、事前

答えて

1

でお願いします。それらはマルチスレッド化に非常に便利です。

NSOperationを基本的にサブクラス化し、コードをメインメソッドに書き込みます。次に操作を操作キューに追加し、各操作は別のスレッドで実行されます。

操作が完了したときにコールバックを設定できるため、解析されたデータをビューに戻すことができます。

+0

それは動作します、ありがとうございます。 –

4

基本的な問題は、Webからデータを取得するまでブロックがinitWithContentsOfURL:になることです(秒がかかることがあります)。あなたがあなたのアプリのメインスレッドで呼び出すと、基本的にネットワークトラフィックの期間、アプリケーション全体がロックされます。

もう1つの方法は、NSURLConnectionを使用してデータをプルダウンすることです。単一メソッド呼び出しinitWithContentsOfURL:と同じくらい便利ではありませんが、本質的に非同期です。だから、自分でスレッドとコールバックを実装するのではなく、いくつかのデリゲートメソッドを実装して、NSURLConnectionのインスタンスを作成するだけです。

詳細については、URL loading systemの公式ドキュメントを参照してください。

0

私はオープンソースRSS/Atom Parser for iPhoneを公開しており、ウェブフィードの読み込みと解析を非常に簡単にしています。

データを非同期にダウンロードするように設定することも、フィードデータを収集するためにバックグラウンドスレッドで同期して実行することもできます。そうすれば、データが解析されている間にUIは無料になります。

関連する問題