0

私はphpサーバーからJSONをロードし、ライブラリで解析し、このデータでオブジェクトを作成するiphone用のアプリに取り組んでいます。私のコードは正常に動作しますが、私のやり方は間違っているようです:

viewController は、読み込み中のビューをユーザーに表示します。一方、ViewController は get 要求を行い、データを受信します。VC は応答を解析し、辞書を取得します。辞書は、辞書から作成されたオブジェクトを返す「作成者クラス」に送信されます。

この操作を 2 回行いますが、設計が悪いと思います。

View Controller は http リクエストを実行する必要がありますか? 「objectLoader」であってはいけませんか? 作成クラスのメイン メソッドは、次のような if/else スパゲッティを大量に作成します。

for(NSString key in dictionary){
    if(key isEqualToString "a key"){
         perform action
    }
    else if(key isEqualToString "an other key"){
         perform action
    }
    ....
}

それを解決するためのアイデアはありますか?キー/セレクターの辞書を作成して解決し、次のようなことを行うことを考えていました:

 for(NSString key in dictionary){
    [self performSelector:[selectors getObjectForKey:key]]
}

しかし、辞書でセレクターを参照できるかどうかはわかりません...

最後に、私に来る他のオプションは、次のようなクラスメソッドを使用して、解析された辞書をオブジェクトに送信することです[ClassName createObjectWithDictionary:parsedDictionary]。それはそれを行う良い方法ですか?

質問が少し曖昧であることは承知していますが、どのデザイン パターンを適用すればよいのか、また、この話で誰が何を担当しているのかについて、少し迷っています。

4

2 に答える 2

2

最善の方法は、MVC パターンを使用し、内部のデータをプッシュおよび削除するメソッドと、モデル データが変更された場合に通知されるデリゲート (UIViewController から派生) のリストを持つデータを持つモデルを使用することです。コントローラー (UIViewController ではない) は、サーバーからのデータのフェッチを開始し、結果を処理するものです。また、すべての UIViewControllers がデータの変更とユーザーの操作を処理します。今のところ、リクエスト ルーチンを処理し、コントローラーでイベントをトリガーするために必要なすべてのデータを格納する RequestController (シングルトーンかどうかは関係ありません) を記述します。ブロックまたは NSNotificationCenter を使用して、リクエストの完了を処理できます。リクエストから RequestController を介して必要なデータを取得した後、コントローラーは必要なパーサーを作成し、解析されたデータをモデルにプッシュできます。

于 2012-08-22T19:25:06.007 に答える
1

個人的には、ViewController に HTTP リクエストを実行させません。私は常にアプリでサービス クラスを作成します。サービス クラスは低レベルの処理を行い、受信した結果の委任を介して呼び出し元 (ビュー コントローラーなど) に通知します。

したがって、その場合の制御フローは次のとおりです。-> ViewController はメッセージを読み込んで画面をロックします->それ自体をデリゲートとしてサービスを呼び出します-サービスは作業を行い、回答を受け取ります->回答が処理され、結果がデリゲートに渡されます-> ViewController は応答を取得し、読み込みメッセージを削除して、応答に対して必要なことは何でも行います。

2番目の質問について:はい、辞書からセレクターを動的に選択することができます-たとえば、セレクターの名前を辞書に保存してから使用することによって

SEL selector = selectorFromString(@"doWork");

呼び出す正しいセレクターを作成します。

于 2012-08-22T19:21:49.830 に答える