2011-10-31 11 views
1

こんばんはみんなで返されるJSONの解析、建築HTTP通信へのアプローチとiOS

私の質問は、具体的な技術よりも工学/デザインパターンのアプローチの詳細です。

私はJSONオブジェクトを返すリモートAPIとのやりとりが多いアプリケーションを開発しています。データの検索、解析、利用は問題ではなく、非常にスムーズに作業しています。私はこの種のシナリオのための最良の設計アプローチについていくつかの方向性を見出したいと思っています。

私は(擬似コードと宣言で)これまで持っているものを説明し、あなたが助けることができるかどうかを確認します。

  1. 必要NSURLConnectionのデリゲートメソッドを実装するHTTPフェッチャクラスを。その完了時に呼び出し元のクラスに

    @implementation HTTPFetcher{ 
        - (id)initWithUrlRequest:(NSURLRequest *)aRequest receiver:(id)aReceiver action:(SEL)aReceiverAction 
        { 
        //set the member variables etc.. 
        } 
    
        //all NSURLConnection delegate methods 
    
        - (void)connectionDidFinishLoading... 
        { 
         [receiver performSelector:action withObject:self]; 
        } 
    } 
    
  2. を返すために、私はその後、HTTPFetcherを呼び出すためのシングルトンHTTPControllerクラスを持っているように私は、コールバックメソッドセレクタでクラスを初期化:

    - (void)postWithRequestString:(NSString *)aRequestString 
    { 
        [urlRequest setHTTPBody:[aRequestString dataUsingEncoding:NSUTF8StringEncoding]]; 
    
        fetcher = [[HTTPFetcher alloc]initWithUrlRequest:urlRequest receiver:self action:@selector(receivedDataFromService:)]; 
        [fetcher start]; 
    } 
    
    - (void)receivedDataFromService:(HTTPFetcher *)aFetcher{ 
        //handle the received data and split the parent object into an NSMutableDictionary 
    } 
    

このアプローチは、私がモデル化しなければならない別々のエンティティ(特に各エンティティのためのSingleton HTTPControllerを持つ)を与えたアプリ向けにはうまく機能します。

私の問題は、JSONのカスタム解析をどこで処理するかです。現時点では、データが必要なViewControllerの解析を行っていますが、これはソースに近すぎるため、さらに抽象化する必要がありますが、わかりません。

シングルトンクラス内での解析を容易にするメソッドを含めるか、アクションを解析するためのコントローラをさらに作成する必要がありますか?

私はあなたからのお便りをお待ちして

おかげ

答えて

1

既存のJSON解析ライブラリ、特にJohn EngelhartのJSONKitをビルドすることをお勧めします。これはおそらく、iOS用のJSON解析ライブラリの中でも最高の性能を持つと考えられます。カスタムJSON解析の実装をすべて省くことができますが、特にあなたのニーズには遅すぎると判明したコードを実装する必要がなくなり、使用するのに十分速くなるまで反復的に修正する必要があります。

HTTPリクエストについては、既にこの動作を実装していることがわかりましたが、かなり堅牢であるという評判を持つ汎用ネットワーキングライブラリとしてASIHTTPRequestまたはAFNetworkingを調べることをお勧めします。注釈AFNetworkingは、上記のJSONKitライブラリをJSON解析に使用します。


方法ASIHTTPRequest(私は私のプロジェクトで使用ライブラリ)の作品は、あなたがURLで要求を作成した後に割り当てるプロトコルASIHTTPRequestDelegateを実装する委譲オブジェクトを使用することです。グローバルネットワークキューはNSOperationQueueで、非同期または複数の同時アクティブ要求を処理します。

あなたsetDelegate:できるオブジェクトは、デリゲートは、デフォルトでdidReceiveData:またはrequestDidFinish:など、さまざまな点でのいずれかの方法を実装しているかどうかチェックを開始しますが、あなたはまた、メソッドのを使ってチェックするカスタムセレクタパスを設定することができますするために個々の操作(setDidFinishSelector:@selector(downloadComplete:))。

例えば、didReceiveData:コールバックが発生したとき、あなたは何ができるか、(すでにこれをカプセル化している、またはAFNetworkingを使用)ASIJSONRequestのためのラッパークラスに保存されているバッファに新たに受信したデータを渡すです。バッファに正しく構文解析できる完全なJSONオブジェクトがある場合は、JSONKitにコールして、不満な作業を行い、別のコールバックを自分自身didReceiveData:ASIJSONRequestDelegateに送信することができます。あなたのアプリケーションの残りの部分で読める形式です。


ASIHTTPRequestを使用する別の方法はブロックを使用しています。要求の完了ブロック、データの受信時に呼び出されるブロックなどの設定がサポートされています。このデザインパターンでは、ラッパークラスも必要なく、コードブロックをパーズ自体を行うように設定し、その目的地に解析された新しいデータを返します。

+0

お返事ありがとうございます。 ASIHTTPRequestは非常に良い呼びだ - 私は実際にアプリケーションのビルドを最初にレビューするときにこれを考慮したが、クライアントの仕様はそれが提供する利点を減らした。さらに、クライアントは可能な限り第三者のライブラリを含むことを嫌っています。良い答え - 時間をとっていただきありがとうございます。 – JordanMazurke

1

は一つの可能​​性は、それが(リモートサーバーからのものを含む)を必要とすることを任意の状態のモデルオブジェクトを依頼するビューまたはビューコントローラのためになります。 Modelオブジェクトは、サーバーから新しいデータがあったときに通知され、内部状態を更新するために必要なデータを呼び出すことができます(plistsやjsonをより標準的な辞書形式に変換するなど)。

関連する問題