CARTHAGE+MVVM
YURU-HUWA LT 2015-12-11
KHANEDA@JUMBOS5
CARTHAGE
CARTHAGE
なんなのか?
▸ cocoapodsに変わる新しいiOSのパッケージ管理ツール
▸ 分散型依存性管理フレームワークとも言われている
CARTHAGE
COCOAPODSとのちがいは?
▸ そもそもの哲学から違う
carthage
$ pod install$ carthage update
+ +
WORKSPACEは
LIBを管理するる
PROJは
LIBを管理しない
Podspec
CARTHAGE
COCOAPODSとのちがいは?
▸ 哲学から違いからうまれるちがい
carthage
分散型 集約型
‣ iOS8からのみ

Dynamic Frameworkを使うため
‣ Dynamic Frameworkなのでビルドが早い

余計なビルドがない
‣ 変にprojファイルをいじらないので健全
‣ Podspec fileが必要
‣ workspaceがごちゃごちゃしている
‣ でもworkspaceはライブラリが管理しやすい
‣ まだメジャー
CARTHAGE
PERFORMANCE - BUILD
xcodebuild -workspace MvvmSample2.xcworkspace -scheme
MvvmSample2 18.92s user 5.33s system 257% cpu 9.415 total
xcodebuild -project MvvmSample.xcodeproj -target 

MvvmSample 0.49s user 0.10s system 105% cpu 0.559 total
TIME COMMAND
+
XCODEBUILD DEBUG
CARTHAGE
LET’S CARTHAGE!!! BUT …
▸ リポジトリ上のコードがdynamic Framework用の

schemeを用意していないといけない
▸ Carthage に対応しているライブラリは Xcode の Shared
Build Scheme を設定しており, この Scheme でビルドする
と Framework が出力されるように設定されています.
https://github.com/SwiftBond/Bond
CARTHAGE
結論
▸ projが綺麗なまま
▸ ビルドも早く
▸ 簡単に使える
▸ 対応していないライブラリにはPull Requestを!
MVVM
MVVM
なんじゃそれ
▸ まぁなんとなく

Model

View

ViewModel



だというのはわかる。

知りたいのは

▸ 何が便利?
▸ どう使えばいいの?
*関係のないKeynoteの

デフォルトの画像
MVVM - なにが便利?
各クラスが公開インスタンス変数を管理することによって、

画面状態の管理を安全に行うアーキテクチャです
ロジック同士のリレーション MVCが準拠される環境でのMVVM
http://rarcher.azurewebsites.net/Post/PostContent/25
MVVM - なにを使おう
流行りは・・・
‣ SwiftBond/Bond 

https://github.com/SwiftBond/Bond

⭐️ 1,891
‣ ReactKit/ReactKit

https://github.com/ReactKit/ReactKit

⭐️ 1,017
‣ ReactiveCocoa/ReactiveCocoa

https://github.com/ReactiveCocoa/ReactiveCocoa

⭐️ 11,600
MVVM - どれがいいのか
‣ SwiftBond/Bond

Libraries for the Swiftbyyohei sugigami 

http://sssslide.com/speakerdeck.com/susieyy/libraries-for-the-
swift
‣ ReactKit/ReactKit

SwiftTask(Promise拡張)でリアクティブプログラミング

http://qiita.com/inamiy/items/d68cdb528b482ee0d8c1
‣ ReactiveCocoa/ReactiveCocoa

ReactiveCocoaをかじってみた

http://qiita.com/paming/items/9ac189ab0fe5b25fe722
それぞれ特徴が違うが関連の定義付け易さで選べばいいと思う
MVVM - 関連の定義付け易さ
‣ ReactKit/ReactKit

SwiftTask(Promise拡張)でリアクティブプログラミング

http://qiita.com/inamiy/items/d68cdb528b482ee0d8c1
‣ streamとか<~が気に食わない・・・
‣ KVOを利用している
var textFieldStream: Stream<String?>?
self.textFieldStream = self.textField.textChangedStream()
(self.textLabel, ”text”)<~ self.textFieldStream
MVVM - 関連の定義付け易さ
‣ ReactiveCocoa/ReactiveCocoa

ReactiveCocoaをかじってみた

http://qiita.com/paming/items/9ac189ab0fe5b25fe722
‣ Functional Reactive Programming
‣ いろんなStreamとViewを関連付ける
self.startTimeTextField.rac_signalForControlEvents(.EditingDidBegin).toSignalProducer()
|> start(next: { _ in
self.dismissKeyboards()
})
https://blog.alltheflow.com/reactive-swift-upgrading-to-reactivecocoa-3-0/
MVVM - 関連の定義付け易さ
‣ SwiftBond/Bond

Libraries for the Swiftbyyohei sugigami 

http://sssslide.com/speakerdeck.com/susieyy/libraries-for-the-
swift
‣ <~は廃止された、bindって書くことになった
‣ KVOを綺麗に書ける感じ
textField.bnd_text.bindTo(viewModel.text)
class HomeViewModel {
var text = Observable<String?>(“")
}
http://sssslide.com/speakerdeck.com/susieyy/libraries-for-the-swift
MVVM - なにが便利?
SWIFTBONDで始めるMVVM
▸ https://github.com/SwiftBond/Bond
import UIKit
class HomeViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var textField: UITextField!
let viewModel = HomeViewModel()
override func viewDidLoad() {
super.viewDidLoad()
textField.bnd_text.bindTo(viewModel.text)
label.bnd_text.bidirectionalBindTo(viewModel.text)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
class HomeViewModel {
var text = Observable<String?>("")
}
Bindされることで、

Modelの変更がViewに反映される。

Controllerに書くべき処理、

Modelでするべき処理が明確になる
MVVM - なにが便利?
DEMO
▸ APIを叩いて結果をTableViewで表示する
▸ 作ろうと思ったらいい感じのがあった

https://github.com/SwiftBond/Bond-Demo-App
ListViewController
ListViewModel
ListCellViewModel
ListCellView
ListCellViewModel
ListCellViewModel
UITableView
ListCellView
ListCellView
bind
MVVM - なにが便利?
説明
ListViewController
ListViewModel
ListCellViewModel
ListCellView
ListCellViewModel
ListCellViewModel
UITableView
ListCellView
ListCellView
bind
var dataSource: ObservableArray<ObservableArray<ListCellViewModel>>!
dataSource.bindTo(tableView) { (indexPath, dataSource, tableView) -> UITableViewCell in
let cell = (tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? ListCellView)!
let viewModel = dataSource[indexPath.section][indexPath.row]
viewModel.name.bindTo(cell.nameLabel.bnd_text).disposeIn(cell.bnd_bag)
viewModel.username.bindTo(cell.ownerLabel.bnd_text).disposeIn(cell.bnd_bag)
viewModel.photo.bindTo(cell.avatarImageView.bnd_image).disposeIn(cell.bnd_bag)
viewModel.fetchPhotoIfNeeded()
return cell
}
まとめ
CARTHAGE, MVVM
▸ どっちも便利
▸ carthage
▸ ビルド時間の短縮
▸ 綺麗なprojファイル
▸ MVVM
▸ Bindで振る舞いを切り分ける

Carthage+mvvm