carthage+mvvm
TRANSCRIPT
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 ViewViewModelだというのはわかる。
知りたいのは
▸ 何が便利?
▸ どう使えばいいの?*関係のないKeynoteのデフォルトの画像
MVVM - なにが便利?
各クラスが公開インスタンス変数を管理することによって、 画面状態の管理を安全に行うアーキテクチャです
ロジック同士のリレーション MVCが準拠される環境でのMVVM
http://rarcher.azurewebsites.net/Post/PostContent/25
MVVM - なにを使おう
流行りは・・・
‣ SwiftBond/Bond https://github.com/SwiftBond/Bond ⭐️ 1,891
‣ ReactKit/ReactKithttps://github.com/ReactKit/ReactKit⭐️ 1,017
‣ ReactiveCocoa/ReactiveCocoahttps://github.com/ReactiveCocoa/ReactiveCocoa⭐️ 11,600
MVVM - どれがいいのか
‣ SwiftBond/BondLibraries for the Swiftbyyohei sugigami http://sssslide.com/speakerdeck.com/susieyy/libraries-for-the-swift
‣ ReactKit/ReactKitSwiftTask(Promise拡張)でリアクティブプログラミングhttp://qiita.com/inamiy/items/d68cdb528b482ee0d8c1
‣ ReactiveCocoa/ReactiveCocoaReactiveCocoaをかじってみたhttp://qiita.com/paming/items/9ac189ab0fe5b25fe722
それぞれ特徴が違うが関連の定義付け易さで選べばいいと思う
MVVM - 関連の定義付け易さ
‣ ReactKit/ReactKitSwiftTask(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/ReactiveCocoaReactiveCocoaをかじってみた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/BondLibraries 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/Bondimport 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
ListCellViewbind
MVVM - なにが便利?
説明ListViewController
ListViewModel
ListCellViewModel
ListCellView
ListCellViewModel
ListCellViewModel
UITableView
ListCellView
ListCellViewbind
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で振る舞いを切り分ける