4

アプリの性質は、ユーザーが tableView を下にスクロールすると、すべての行に UIImages を表示する UITableView です。VIPER アーキテクチャを壊さずにイメージをセルにロードするにはどうすればよいですか?

--VC code--

func cellForRowAtIndexPath...... {
    var cell = dequeueCellWithIdentifier.....

    //Method 1
    cell.image = outputInteracter.loadImage("someHttpImageLink")

    //Method 2. - using a completion block
    outputInteracter.loadImage(anImage -> {
        cell.image = anImage
    }
}

プレゼンターが関与しておらず、VIP の境界間で構造が渡されないため、上記の方法はどちらも VIP を壊すようです。

VIPを使用して(メインスレッドをブロックせずに)ダウンロードされた画像を取得するための非同期呼び出しを行うために、TableViewのUIImagesを取得することをどのように提案しますか? 呼び出しパターンを次のようにすることはできますが、ステップ 4 で混乱します。

  1. VC --> interacterOutput.loadImage("someLink")
  2. Interacter --> 画像を取得する作業を行い、UIimage をプレゼンターに送信します
  3. プレゼンター --> UIImage は既に VC の正しい形式になっているため、情報を VC に戻します。
  4. VC --> セルがイメージの準備ができていることを認識できるように、コードをどのように設定すればよいですか? tableView全体をリロードしたくない

どんな助けでも大歓迎です。

4

1 に答える 1

13

あなたが説明したシナリオはそれほどVIPERではありません。VIPER では、プレゼンターはビューとインタラクターの中間に位置します。あなたの説明は、VからI、Pへの一方向の制御フローを備えたClean Swiftにより近いものです。

質問が Clean Swift に関するものであると仮定すると、まずビジネス ロジックが何であるかを明確にする必要があります。アプリの詳細を知らなくても、最初にインタラクターに JSON でオブジェクトのリストを取得するように依頼したとしか思えません。各オブジェクトには、個別に取得する必要があるどこかの画像へのリンクがあります。

私の仮定が正しければ、これらの個々の画像を取得することはビジネス ロジックではありません。これは、ビジネス ロジックの一部にすぎません。ビジネス ロジックは、最初にオブジェクトのリストを取得することです。

オブジェクトのリストが JSON で受信されると、プレゼンターはこれらのオブジェクトを表すビュー モデル オブジェクトを組み立てることができます。画像の URL は、UIImage ではなく単純に String として表すことができます。

ビュー モデル オブジェクトをビュー コントローラーに戻す前にこれらすべての画像をフェッチするのを待つ場合、UI は技術的にはブロックされていませんが、ユーザーがテーブル ビューにコンテンツを表示するまでに長時間待機します。したがって、画像の URL をビュー コントローラーに渡すだけです。

その後、View Controller は、インタラクターやプレゼンターを介さずに、実際の画像をすべて取得できます。SDWebImageのようなものを使用して、パフォーマンス上の理由から画像を取得およびキャッシュできます。

すべてが VIP サイクルを通過する必要はありません。以下が役立つ場合があります。

ビジネス ロジックは、オブジェクトのリストをフェッチするものと考えてください。それが完了すると、ビジネス ロジックが実行されます。ビュー コントローラーは、実際の画像ではなく、画像の URL 文字列をユーザーに表示することを選択できます。一般的ではありませんが、これは確かに 1 つの表現です。ただし、View Controller は画像を UIImage として表示することを選択します。この表示は、View Controller の内部のみです。それは本当にあなたのビジネスロジックではありません。

ビューコントローラーは画像自体を取得できます。カスタムサブビューに取得を依頼することもできます。

質問のサブ質問は、VIP サイクルを経て画像を個別にフェッチする場合、テーブル ビューをリロードしないことです。これを行うことはお勧めしません。しかし、フォト アルバム コレクション ビューのように、オブジェクトのリストが実際には単なる画像のリストである場合は、これが必要になることがあります。画像の URL、リクエスト オブジェクトの行/列データをインタラクターに埋め込みます。画像が非同期的に返される場合、この画像が表示される行と列は既にわかっています。それをプレゼンターに渡してからビューコントローラーに渡すだけです。ビュー コントローラーは、テーブル全体またはコレクション ビューではなく、単一のセルを再読み込みできます。

これが、VIPER、Clean Swift、VIP サイクル、およびビジネス ロジックとは何かを明確にするのに役立つことを願っています。

于 2016-01-21T03:50:01.237 に答える