0

サーバーに接続して画像のリストを取得し、それらをダウンロードしてグリッドに表示するアプリを作成しています。

このプロセスのパート1は、サーバーに接続し、画像のURLのリストを要求するクライアントクラスによって実行されます。ビューコントローラでこれを行い、ビューに渡します。

パート2は、私が作成した画像キャッシュクラスによって実行されます。このクラスは、各画像のURLを取得し、アプリがそれをダウンロードして以前に保存したかどうかを確認します。その場合、ファイルシステムから画像を取得して返します。それ以外の場合は、画像を非同期でダウンロードして保存します。

私が今している方法では、ビューコントローラーが画像識別子のリストを取得してビューに渡します。次に、ビューは各画像の画像ビューを作成してプレースホルダー画像で埋め、次に各画像の画像キャッシュを要求し、ダウンロード時に画像を埋めます。

ビューの描画関数自体に、画像をダウンロードするためのこのロジックがあるのは悪い設計ですか?私のビューは表示されるはずのデータを取得するための作業を行っているため、MVCの違反のように感じます。ただし、実際のネットワーキングは他の場所(イメージキャッシュクラス内)で行われており、ビューが単にを呼び出すように抽象化されています[ImageCache getImageForIdentifier:... completionHandler:...]

4

2 に答える 2

1

あなたのImageCacheクラスはモデルレベルのクラスの例です。UIについての知識はありません。優れたMVCは、グリッドビューのように、ViewクラスがModelクラスと直接通信してはならないことを示しています。それがコントローラーの目的です。

よりクリーンな実装は、コントローラーがImageCacheを使用してダウンロードを実行し、グリッドビューを更新できるようにすることです。これにより、一部のビジネスロジックがグリッドビュークラスから移動し、プレゼンテーションのみを気にするようになります。

于 2012-07-19T01:12:32.440 に答える
1

ビュークラスはネットワーク呼び出しを行うべきではありません。ビューはコントローラーと通信するだけで、表示する必要のあるデータを取得できます。それで、

  1. コントローラの仕事は、URLまたは画像を取得することです。
  2. 後で表示する必要があるすべての画像のコレクションを持つModelクラスがあります。このモデルクラス参照をコントローラーに追加します。
  3. コントローラはキャッシュをチェックし、モデルクラスにデータを入力する必要があります。キャッシュに画像がない場合、コントローラーはモデル用にそれらの画像をダウンロードする必要があります。
  4. コントローラからパブリックメソッドを公開して、モデルオブジェクトからビューにデータを入力します。

私の行くところは、3つの異なるクラスを作成することです。

  1. ImageCahce=モデルクラス
  2. ImageCollection=モデルクラス
  3. ImageDataController=コントローラークラス。

ImageCacheクラスは、ダウンロード済みの画像を保存します。CoreDataにある可能性があります。ImageCollectionクラスは、ImageCacheから毎回入力され、後でImageDataControllerから必要な新しい画像が追加されます。

于 2012-07-19T01:13:42.813 に答える