2015の20日目の記事です。サイバーエジェントの新卒のギア@nghialvと申します。現在,AmebaFRESH!という新規生放送サービスのチームにiOSエンジニアやっています。私は入社した時に,多くのユーザーに使われているAmebaアプリチームに入りました。Amebaアプリはなん年前から作成されましたので,今までの他のiOSアプリと同じでMVCモデルに基づいて設計されています。アプリがどんどん大きくしてMVCモデルの問題点を感じるようになりました。4ヶ月前にAmebaFRESH!の新規サービスに移動して,MVVMモデルとReactiveCocoaを検討して,導入しました。今日MVVMモデルとReactiveCocoaについて説明させていただきます。上の図は一般的なMVCモデルの仕組みです。ViewControllerの3つの部分に分割しています。このモデルは以下の2つ問題点が存在していることがわかりました。ViewControllerはModelとViewを持っていて,ロジックの処理は基本的にViewControllerに配置されています。アプリの成長と共に大規模なViewControllerがどんどん増えていきます。ViewControllerと呼んでいますね)iOSエンジニアの皆さんはこの問題をあったことがありましたね。次は,ViewControllerはViewを持っていますので,Viewに依存していて,ViewControllerのテスト書くのはなかなか難しいと思います。そこで,テスト書ける部分は主にModelとUtilityの周りだけになります。それらの問題点でMVVMモデルの導入を検討しました。上の図により,ViewModelの部分が追加されました。ViewModelはModelオブジェクトのデータを基にViewに食わせる値を生成するロジック(プレゼンテーションロジック)やViewの状態を持ちます。iOSのViewControllerはViewと同じ役割になっています。binding概念を入っています。bindingでViewModel側はデータの変更がありましたら,Viewに通知を送ります。ViewModelはよく変われるViewを持っていないので,モデルみたいにテスト書くことは容易になります。大規模なViewControllerがなくなります。ViewはViewModelにバインディングする仕組みなので,Viewのリセットなどを行いたい場合は単純新しいViewModelインスタンスを生成して,再バインディングすることで,Viewがリセットされます。ステートの管理が楽になります。(これは自分が感じできた良い点ですが,もし何かわかりましたら,追加お願い致します。)上はバインディングについて何回も言いましたが,具体的はどんな感じって疑問している人もいるでしょう。それはReactiveCocoaの役割ですね。pipesからReactiveCocoa理解ReactiveCocoaの定義は以下のとおりですね。time.実は最初私はこの定義を呼んだ時に,ReactiveCocoaはなんのものか想像できなかったです。使ってみて,この定義の文は完璧だとわかるようになりました。pipesの仕組みと全く同じかなと考えていますよ。pipesを用いて,ReactiveCocoaを説明させていただきます。これを読んだ後に絶対ReactiveCocoaはなんのものか想像できるようになると思います。定義の文に注目したいのは「Stream」「Transforming」「Composing」の3つの言葉です。}sink.sendNext("hi")上の図をみると説明がなくてもなんとなくイメージできましたね。eventをsinkに入れて,observerがそのイベントを受け取ることができます。pipesの仕組みと似ているでしょう。水は上に流すことができないですが,イベントはすべての方向に行けます。}sink.sendNext("hi")もう一点注意が必要なのは,observeする前のイベントを受け取ることができないです。Transforming次はtransformですね。以下の図をみると説明は何もなくてもすぐわかります。}sink.sendNext("hi")Transformingはsignalから別のsignalに変換することです。pipesの仕組みと似ているでしょう。ReactiveCocoaはいろいろなtransformを提供しています。私は以下のようなものをよく使っています。observeOn...もちろん,自分は新しいtransform追加することは簡単です。Composing数学にcomposeは以下のとおり定義されていますね。}同じ意味で,ReactiveCocoaはsignalとtransformを何回も組み合わせることが可能であり,新しいsignalを生成することができます。pipesの仕組みと似ているでしょう。ReactiveCocoaを使うとある時にアプリは以下のようなかんじになりますね。pipesを使ってReactiveCocoaを説明しました。ReactiveCocoaは他の概念もいっぱいありますが,基盤の概念は上のとおりです。ReactiveCocoaとMVVMを組み合わせるサンプルモバイルアプリではよくあるリスト画面をReactiveCocoaとMVVMモデルでの実装を紹介させていただきます。実は今のプロジェクトでCellに対するCellModelという概念も導入していて,TableViewやCollectionViewのCellとCellModelを管理するため,自分が開発しているHakuba、Sapporoを使っています。}}最後に今日、自分の理解でReactiveCocoaとMVVMモデルを軽く説明しました。MVVMモデルのサンプルプロジェクトやブログはまだまだ多くないので,時々困りました点もありましたが,プロジェクトに導入してみて,プロジェクトの設計が綺麗になっていて,毎日楽しく開発できています。明日はk66dangoさんです。upLoginユーザーは見つかりませんでした。