66
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dependency Injection in MVVM Architecture with ReactiveCocoa Part 1: 導入

Last updated at Posted at 2015-08-31

以下のブログ記事の翻訳です1

Dependency Injection in MVVM Architecture with ReactiveCocoa Part 1: Introduction


前回のブログ記事では、シンプルなアーキテクチャのアプリを開発する中で、Swinjectを用いたdependency injectionについて説明しました。今回からのシリーズでは、ReactiveCocoaを用いてMVVM (Model-View-ViewModel)アーキテクチャのアプリを開発し、その中でdependency injectionを行います。

シリーズを通して以下のことを学びます。

  1. MVVMアーキテクチャを明示的に表現するXcodeプロジェクトの設定方法
  2. Swinjectを用いてMVVMアーキテクチャの中でdependency injectionを行う方法
  3. ReactiveCocoaを用いてModelからViewModel、ViewModelからViewへとイベントを伝播させる方法

シリーズではdependency injection、Swinject、MVVM、ReactiveCocoaを利用した実践的な開発に焦点を当てます。それぞれの詳細については別の記事を参考にしてください。推奨する記事については後で記事の中で紹介します。

これから開発する例題のアプリは、以下のGIFアニメのように、PixabayAPIを通して非同期で画像を検索・ダウンロード・表示します。

Screen Record

ソースコードはGitHubのリポジトリからダウンロードできます。

MVVM

MVVM (Model-View-ViewModel)とは、ViewはViewModelに依存し、ViewModelはModelに依存するという、線形でシンプルな依存関係を持つアーキテクチャあるいはパターンのことです。逆に、イベントの流れはModelからViewModel、ViewModelからViewへと一直線になります。

Diagram-MVVM.png

一方で、MVC (Model-View-Controller)型のアーキテクチャあるいはパターンでは、ControllerがModelとViewに依存し、イベントはModelからController、およびViewからControllerへと流れます。

Diagram-MVC.png

MVCの問題は、プロジェクトの開発が進むにつれ、Controllerが大きく複雑になりがちなことです。その原因は、ControllerがModelとViewの両方 (つまりすべて) の面倒を見てしまうことです。MVCは、実際にウェブアプリケーションの分野ではRuby on RailsASP.NET MVCなどのフレームワークのサポートがあり良いパターンなのですが、iOSアプリの分野では、MVCは一枚岩でメンテナンスしにくいコードに陥りやすいです。

MVCのその欠点のため、モバイルアプリあるいはデスクトップアプリを開発する上でMVVMが人気になってきています。iOSアプリでは、MVVMの "View" は "View" (UIView) と "ViewController" (UIViewController) から成り立ちます。Viewのロジック (1000という値を"1,000"と表示するなど) はViewModelに実装されます。Viewは単純にViewModelから提供される値を表示します。Modelはビジネスロジックに対して責任を持ちます。このように責任を分離することにより、MVVMアーキテクチャのiOSアプリはテストしやすくなります。

Diagram-MVVM-iOS.png

参照

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を利用した開発を順を追って説明していきます。

  1. 訳注: 英語版の著者本人による翻訳のため、翻訳に関わる著作権上の問題はありません。

66
60
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?