【Swift】MVPを簡単にまとめてみる


はじめに

今回は、MVPアーキテクチャについて簡単にまとめていきたいと思います。

MVPとは

特徴
・Model, View, Presenterにより分割されるGUIアーキテクチャ
・データ同期する方法に、PassiveViewとSupervisingControllerの二つがある

フロー同期とオブザーバー同期

まず、PassiveViewとSupervisingControllerを理解する前に、フロー同期とオブザーバー同期の説明をします。

フロー同期

上位モジュールのデータを下位モジュールに適宜セットして同期する同期方法
つまり、手続き的な同期方法。

メリット
・画面遷移間でデータの受け渡しなどでデータフローを追いやすい
→上位モジュール(遷移先)が下位モジュール(遷移元)の参照を持つことができるため、有効

デメリット
・共通したデータを参照しているすべての箇所の参照を持っておかなければいけなくなるので、参照の管理が煩雑になりやすい。

オブザーバー同期

下位モジュール(監視元)が上位モジュール(監視先)からObserverパターンを使い送られてくるイベントを受け取ってデータを同期させる同期方法。
つまり、宣言的な同期方法である。

メリット
・共通した監視先を持つ複数の箇所でデータ同期をしやすい
・上位モジュールが下位モジュールの参照をもつ必要がなく、かつコンポーネント間の距離に関係なくデータ同期ができる。(互いに疎結合)

デメリット
・データ変更のたびに同期処理が実行されるため、いつデータ同期が行われるのかが追いづらい。

Model

MVC, MVVMなどもModelと同じ。

View

View+ViewController

Presenter

ViewとModelの仲介役
プレゼンテーションロジックを担う
1Viewにつき、1Presenter作成することが多い
PresenterからはViewをweak参照することが多い

PassiveView

Presenter→Viewでフロー同期を使う

MVPのフロー同期例
myNameLabel.text = "REON"
tableView.reloadData()

Viewはすべてのユーザー入力イベントをPresenterに渡す。Presenterは入力に応じてプレゼンテーションロジックを処理して、Viewに対して手続き的な描画処理を出す。
ViewはPresenterの指示によってのみ描画処理を行い、Viewを基準とした描画処理は行わない。

SupervisingController

フロー同期とオブザーバー同期の両方を使う
Presenter→View間をフロー同期
Model→View間をオブザーバー同期する
監視元であるViewが監視先であるModelからNotificationCenterなどで送られるイベントを受け取って描画処理を行うことが例として挙げられる。
Viewは簡単なプレゼンテーションロジックを持つ。
Presenterは複雑なプレゼンテーションロジックを持つ。
ModelはPresenterによって呼び出され、Viewに対して描画に必要なデータをイベント通知によって受け渡しする。

SupervisingControllerはModel→View間にオブザーバーパターン同期を用いることで、処理を簡潔にかける。

おわりに

MVPはPassiveViewかSupervisingControllerのどちらを使うのかがミソですね。