2011-01-02 12 views
1

私は渡したいものが満載のXMLドキュメントを返すAPIに対して認証を行う関数を書いています。この関数は、NSURLConnectionのsendSynchronousRequestメソッドを使用して同期呼び出しを行うことは非常に簡単です。しかし、このメソッドが返されると、NSXMLParserのインスタンスをインスタンス化し、データで初期化し、解析などを行う必要があります。sendSynchronousRequest返品後に機能しますか? )、NSXMLParserをインスタンス化し、解析するデータを与え、単一のメソッド呼び出しで解析を開始し、解析が終了するまで戻りません。例えば非同期のCocoaクラスを同期的に動作させる

:上記の例で

- (void) myFunction 
{ 
/* other code */ 
NSData *returnedData = [NSURLConnection sendSynchronousRequest:authRequest returningResponse:&authResponse error:&authError]; 

MyParserClass *parser = [[MyParserClass alloc] initWithData:returnedData]; 
[parser parseData]; 
} 

MyParserClassはNSXMLParserデリゲートであり、そして通常、委任された方法で全ての解析を行います。 parseDataは解析を開始し、終了するまで戻りません。

どのようにすればparseDataと書くべきですか?ブロックアプローチ?

EDIT:私はNSXMLParserの-parse関数が同期的であることを思い出しました。それでも、私は誰でも非同期クラスでこれを行う方法を説明できるかどうかを知りたいです。

+0

これはすべてバックグラウンドスレッドで発生しています。同期ネットワークは、ココアでは決して正しい方法ではありません。 –

答えて

3

NSXMLParserDelegateプロトコル(たとえば、MyParserDelegate)を実装するクラスを作成することをお勧めします。デリゲートメソッドがパーサーによって呼び出されると、XMLファイルから抽出する情報を含むデータ構造が構築されます。

 
// create the delegate 
MyParserDelegate *delegate = [[MyParserDelegate alloc] init]; 

// create the parser 
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:returnedData]; 
[parser setDelegate:delegate]; 

// parse the file 
if ([parser parse]) 
{ 
    // the XML was valid and parsed without error 
    // now, do something with the data you extracted 
    // e.g., self.xmlData = [delegate xmlBasedDataStructureBuiltByDelegate]; 
} 
else 
{ 
    // the XML was invalid 
    // handle the error 
} 

MyParserDelegateの機能を使用すると、XMLファイルから抽出したいのかに完全に依存し、次のように私はそれを呼び出すと思います。詳細についてはAppleのEvent-Driven XML Programming Guideをお読みください。

同期NSURLConnectionを使用する場合は、バックグラウンドスレッドで行う必要があります。

+0

応答pwcに感謝します。残念ながら私の質問には答えません。私は非同期クラス/ APIを同期的に動作させる方法論に懸念しています。私の質問は主にブロックに関係しています。なぜなら、私の問題は、私のプログラム内のどこか他の場所に戻ったときに、1回の呼び出しで次のことを行う必要がある関数(上記の 'my​​Function')を構築したことです。サーバと通信し、その応答を解析し、そのデータを格納する。問題は、2番目の部分は非同期APIに基づいており、私の1つの関数がその独特の性質を保つのに役立つものではないということです。 –

+2

実際にブロックを使用する必要はありません。何も起こっていない非同期です。特に、NSXMLParserは非同期ではありません。 '[NSXMLParser parse]'は、解析が完了した後に戻ります。非同期の場合はすぐに戻り、処理が完了したら代理人に通知されます。デリゲートを訴えるので非同期に見えますが、そうではありません。 一般に、スレッドと同期メカニズムを使用して非同期プロセスを同期させることができます。非同期を実行するためにスレッドを開始することができます。スレッドが完了するのを待ちます。 – pwc

関連する問題