2017-09-11 3 views
0

私は最近のプロジェクトにVIPERアーキテクチャを使用しています。 しかし、私はUITableView DataSourceを実装する方法が不思議です。VIPMのUITableViewデータソース用のViewModel、

VIPERでは、Viewはパッシブです。イベントをPresenterに送信すると、Presenterは適切なViewData(ViewModel)をViewに送信します。

ViewでViewViewのViewModelsを保存しました。 (ビューはプレゼンターにデータを問わない。)

class View: UIViewController, UITableViewDataSource { 
    var viewModels: [CellViewModelType] = [] 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return viewModels.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let viewModel = viewModels[indexPath.row] 
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIndetifier", for: indexPath) 
    cell.configure(with: viewModel) 
    return cell 
    } 
} 

ユーザーがのtableViewで項目を選択すると、ビューはプレゼンターにindexPathでdidSelectItemAtイベントを送信します。プレゼンターは、イベントの適切なアクションを決定したり、VCを押したり、データをフェッチしたりします。

したがって、PresenterはViewData(またはReal Data)を知っている必要があります。 またはPresenterはInteractorにReal Dataを格納するため、イベントをInteractorに渡します。

ここに私のジレンマがあります。 データが広がっています。View、Presenter、Interactor。リアルデータはバックグラウンドで非同期に変更できるので(チャットアプリのように)

ご協力いただければ幸いです。 :D

答えて

0

PresenterまたはInteractorのViewModels配列とData配列のデータの不一致を恐れていますか? 新しいデータがInteractorによってフェッチされた場合、Presenterに渡されます。ここでは、最初にViewModelsとしてViewに同期して送信し、それをPresenterのData配列に設定することをお勧めします。 didSelectCellAtIndexPath:と呼び出して、IndexPathでイベントをPresenterに送信すると、Data配列からデータにアクセスする際の追加のチェックが良い考えです。

0

プレゼンターはViewModelsを保存し、Interactorはエンティティを保存する必要があります。ユーザーがアイテムのpresentorを選択すると相互作用因子のメソッドを呼び出すためにdesideことができますので、

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let viewModel = presenter.getViewModel(at: indexPath.row) 
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIndetifier", for: indexPath) 
    cell.configure(with: viewModel) 
    return cell 
} 

のようなのviewmodelsのためのプレゼンターを尋ねるべきビューはそう。したがって、モジュールの状態はインタラクタにのみ格納され、ビューステートはプレゼンタに格納されます。表示には状態がありません

関連する問題