“Next	Step”of	becoming	familiar	with

RxSwift	&	MVVM	Pattern.
Fumiya	Sakai	(Just1factory)
2018/12/18	potatotips	#57	@	istyle	Inc.
自己紹介
・Fumiya	Sakai
・Mobile	App	Engineer
アカウント:
・Twitter:	https://twitter.com/fumiyasac

・Facebook:	https://www.facebook.com/fumiya.sakai.37

・Github:	https://github.com/fumiyasac	

・Qiita:	https://qiita.com/fumiyasac@github
発表者:
・Born	on	September	21,	1984
これまでの歩み:
Web	Designer
2008	~	2010
Web	Engineer
2012	~	2016
App	Engineer
2017	~	Present
ほんの少しだけ告知と宣伝
「少しの工夫とアイデアでできる表現集」として、これまでサンプル開発や実務の
中で培ったノウハウ等から、UI実装いくつかのまとまったサンプル実装を例にUI構
築をする上で重要な実装ポイントやアイデアを紹介していく形式にしてみました。
収録サンプル:
https://github.com/fumiyasac/ios_ui_recipe_showcase
現在Boothにて販売中です(近日アップデート予定)	¥1,000
同人誌「iOSアプリ開発	UI実装であると嬉しいレシピブック」を書きました。
https://booth.pm/ja/items/1021745
概要:
今回取り組む事になったきっかけ
この記事を書いた時から1年以上の月日が流れてしまった…危機感。
1年前に書いた記事の知識から1歩踏み出す:
RxSwiftでの実装練習の記録ノート(前編:Observerパターンの例とUITableViewの例)

https://qiita.com/fumiyasac@github/items/90d1ebaa0cd8c4558d96

RxSwiftでの実装練習の記録ノート(後編:DriverパターンとAPIへの通信を伴うMVVM構成のサンプル例)

https://qiita.com/fumiyasac@github/items/da762ea512484a8291a3
自分が試してみたいUIライブラリと組み合わせた実装を使ってRxSwiftを利用したサンプルを作る
以前の復習も込めて応用した実装を試みる:
この記事ではあくまで既存のサンプルコードに関する解説とRxSwiftの基本理解についての解説まで
※	記事自体も年末にテコ入れします
※	RxSwiftの	Observer	/	Driver	パターンを使用
今回の発表でのサンプルコード
実際に動かせるコードもご用意しました	&	解説コメントも残しました。
https://github.com/fumiyasac/RxSwiftUIExample
Storyboardの構成
実装部分に集中するため構成は比較的シンプルで基本的な形にしています。	
MainViewControllerの
Floating Menuから遷移
ContainerViewで表示
ライブラリを使った
Floating Menu
データとUIの関連性
Model	-	ViewModel	-	Viewにおける処理と役割の概要の図解になります。	
状態更新のリクエスト
ViewController ViewModel Model
NewYorkTimesProductionAPI
利用するデータの作成
※ ViewModelでAPIリクエストを実行する場合
UI側への変更を伝える 利用するデータの受取
利用したUI構築用ライブラリの一覧
下記の様なUIライブラリを活用して構築をしています。
Floaty:
Androidの様なフローティングメニューを実現
DeckTransition:
Apple	Musicの様なハーフモーダル表示を実現
AnimatedCollectionViewLayout:
UICollectionViewを動かす際に様々な動きをつける
全体の画面構成を決めるものからオマケ的な要素のものまで
アニメーションや表現が綺麗でかつ取り扱い易そう(RxSwiftの実装と調和しそう)なものを選びました。
FontAwesome.swift:
「Font	Awesome」アイコンを利用する
BTNavigationDropdownMenu:
UINavigationBarにドロップダウンメニューを実現
Toast-Swift:
Androidの様なToast型のポップアップ表示をする
UICollectionViewをベースにしたカルーセルを表示する
UI部分に関するちょっとした考慮をRxSwiftで上手に表現する。
カルーセルの回転部分の表現は
ライブラリ: AnimatedCollectionViewLayoutで実現
// ViewController側で利用するためのプロパティ
let featuredLists: Observable<[FeaturedModel]>!
let shouldHidePreviousButton = BehaviorRelay<Bool>(value: true)
let shouldHideNextButton = BehaviorRelay<Bool>(value: false)
let currentIndex = BehaviorRelay<Int>(value: 0)
前へ・次のボタンの表示状態と
現在の表示位置に応じた振る舞い
ボタン押下
ViewModelに定義したBehaviorRelayの値変化とUIが関連する
① ボタンタップ処理でViewModelのプロパティを更新
② 変更されたViewModelのプロパティを元に
View要素の状態が決定される
ドロップダウンメニューから表示内容を変更する
UIライブラリと組み合わせた表現をRxSwiftで上手に表現する。
// ViewController側で利用するためのプロパティ
let allTitles: Observable<[String]>!
let selectedInformation = BehaviorRelay<InformationModel?>(value: nil) タイトルを押下すると内容が切り替わる
項目選択
ドロップダウンメニューを表示する表現について
はBTNavigationDropdownMenuを利用
ViewModelに定義したBehaviorRelayの値変化とUIが関連する
② タップ処理でViewModelのプロパティを更新
③ 変更されたViewModelのプロパティ
を元にView要素の状態が決定される
※ BTNavigationDropdownMenuに関する初期設定を行う部分。
① 表示要素の初期設定
初回表示状態からボタンを押すと末尾に10件ずつデータを表示する
API通信を利用してデータを取得して伴う表示部分の調整を実行する。
// ViewController側で利用するためのプロパティ
let isLoading = BehaviorRelay<Bool>(value: false)
let isError = BehaviorRelay<Bool>(value: false)
let recentNewsLists = BehaviorRelay<[RecentNewsModel]>(value: [])
変数: resentNewsListsへ10件ずつ値が追
加されてContainerViewの高さも増加する
ボタン押下
API通信でデータを取得する部分に関するコード例
① Single<JSON>型として、リクエストが1度だけ成功
か失敗かのレスポンスを返すような形にする
② ViewModel部分でAPI通信処理を実行
し結果に応じてプロパティを更新する
※ BehaviorRelay<[RecentNewsModel]>へ追記
インクリメンタルサーチで該当したデータを最大10件表示する
入力された文字列の長さを考慮しながらAPIのリクエストを実行する。
// ViewController側で利用するためのプロパティ
let isLoading = BehaviorRelay<Bool>(value: false)
let isError = BehaviorRelay<Bool>(value: false)
let searchNewsLists = BehaviorRelay<[SearchNewsModel]>(value: [])
3文字以上
入力する
// 検索ボックスの値変化を監視対象にする
private var searchBarText: Observable<String> {
// ① 3文字未満のキーワードの場合は受け付けない
// ② APIリクエストの際に0.5秒のバッファを持たせる
return keywordSearchBar.rx.text
.filter { $0 != nil }
.map { $0! }
.filter { $0.count >= 3 }
.debounce(0.5, scheduler: MainScheduler.instance)
.distinctUntilChanged()
}
必要以上のAPIリクエストをしない様に配慮
※ debounce / throttle を上手に活用
今回の発表内容の補足と詳細
本日お話した内容に関しては下記の記事にもまとめております。
https://qiita.com/fumiyasac@github/items/e426d321fbb8ab846bb6
今回のまとめ
RxSwiftとMVVMパターンの組み合わせとUI実装との連結いいと思った!
Step1)	基本のおさらい
まずはRxSwiftの復習

・Observerパターン

・Driverパターン

・頻出のOperatorの理解
このサンプル開発を通じて:	
データ層やUIと関わり合いがある層に関する構成をアーキテクチャも混みで整理した形にすることで、

どの値変化によって関連するUI要素が変化するかの見通しや関係性を持っているか?ということが見

える形になる。それによってUI実装という観点からも大きくメリットがあると認識できた。
Step2)	実装に関する研究
実装例の考察やサンプル研究

・想定している動き

・MVVMパターンの理解

・新旧バージョンの差分
Step3)	実装とUIの結合
ショーケース的なサンプル実装

・UIとViewModel実装の結合

・Operatorの利用方法の理解

・UI表現とRxSwiftの調和
Thank	you	for	listening	!

RxSwiftとMVVMパターンと仲良くなる次のステップ