以下のブログ記事の翻訳です1。
Dependency Injection in MVVM Architecture with ReactiveCocoa Part 1: Introduction
前回のブログ記事では、シンプルなアーキテクチャのアプリを開発する中で、Swinjectを用いたdependency injectionについて説明しました。今回からのシリーズでは、ReactiveCocoaを用いてMVVM (Model-View-ViewModel)アーキテクチャのアプリを開発し、その中でdependency injectionを行います。
シリーズを通して以下のことを学びます。
- MVVMアーキテクチャを明示的に表現するXcodeプロジェクトの設定方法
- Swinjectを用いてMVVMアーキテクチャの中でdependency injectionを行う方法
- ReactiveCocoaを用いてModelからViewModel、ViewModelからViewへとイベントを伝播させる方法
シリーズではdependency injection、Swinject、MVVM、ReactiveCocoaを利用した実践的な開発に焦点を当てます。それぞれの詳細については別の記事を参考にしてください。推奨する記事については後で記事の中で紹介します。
これから開発する例題のアプリは、以下のGIFアニメのように、PixabayのAPIを通して非同期で画像を検索・ダウンロード・表示します。
ソースコードはGitHubのリポジトリからダウンロードできます。
MVVM
MVVM (Model-View-ViewModel)とは、ViewはViewModelに依存し、ViewModelはModelに依存するという、線形でシンプルな依存関係を持つアーキテクチャあるいはパターンのことです。逆に、イベントの流れはModelからViewModel、ViewModelからViewへと一直線になります。
一方で、MVC (Model-View-Controller)型のアーキテクチャあるいはパターンでは、ControllerがModelとViewに依存し、イベントはModelからController、およびViewからControllerへと流れます。
MVCの問題は、プロジェクトの開発が進むにつれ、Controllerが大きく複雑になりがちなことです。その原因は、ControllerがModelとViewの両方 (つまりすべて) の面倒を見てしまうことです。MVCは、実際にウェブアプリケーションの分野ではRuby on RailsやASP.NET MVCなどのフレームワークのサポートがあり良いパターンなのですが、iOSアプリの分野では、MVCは一枚岩でメンテナンスしにくいコードに陥りやすいです。
MVCのその欠点のため、モバイルアプリあるいはデスクトップアプリを開発する上でMVVMが人気になってきています。iOSアプリでは、MVVMの "View" は "View" (UIView) と "ViewController" (UIViewController) から成り立ちます。Viewのロジック (1000
という値を"1,000"
と表示するなど) はViewModelに実装されます。Viewは単純にViewModelから提供される値を表示します。Modelはビジネスロジックに対して責任を持ちます。このように責任を分離することにより、MVVMアーキテクチャのiOSアプリはテストしやすくなります。
参照
- Introduction to MVVM
- ReactiveCocoa and MVVM, an Introduction
- MVVM Tutorial with ReactiveCocoa: Part 1/2
ReactiveCocoa
MVVMでは、ModelからViewModel、ViewModelからViewへとイベントを伝播させます。このシリーズでは、イベントを扱うためにReactiveCocoaを使用します。ReactiveCocoaはイベントのストリームを構成し、変換するためのAPIを提供します。ReactiveCocoaがない場合、イベントはデリゲートメソッド、コールバッククロージャ、UIControlのアクション、KVO (Key-Value Observation) などで表現されます。そのため、それぞれのイベントのタイプにより、別々の方法でイベントハンドリングする必要がありました。ReactiveCocoaがある場合、イベントはEvent
型で表現され、イベントのストリームはSignal
あるいはSignalProducer
で表されます。元のイベントの種類に関わらず、抽象化された同一の方法でイベントを扱うことができるようになります。この先の記事では、ReactiveCocoaでシンプルになったイベントを利用していきます。もしReactiveCocoaをこれまで使ったことがなければ、次の記事に進む前に以下のリンク先を読むことをお薦めします。
参照
まとめ
MVVMでは、ViewからViewModelへ、ViewModelからModelへと向かう依存関係を持ち、逆にイベントはModelからViewModelへ、ViewModelからViewへと流れるシンプルで線形的なアーキテクチャです。ReactiveCocoaは、デリゲートメソッドやコールバッククロージャなど多様な形のイベントをひとつのEvent
型のイベントに抽象化します。MVVMアーキテクチャとReactiveCocoaを利用したiOSアプリはシンプルに保つことができるため、メンテナンスやテストをしやすくなります。次回のブログ記事からは、MVVM、ReactiveCocoa、dependency injectionそしてSwinjectを利用した開発を順を追って説明していきます。
-
訳注: 英語版の著者本人による翻訳のため、翻訳に関わる著作権上の問題はありません。 ↩