carthage+mvvm

20
CARTHAGE+MVVM YURU-HUWA LT 2015-12-11 KHANEDA@JUMBOS5

Upload: ken-haneda

Post on 16-Apr-2017

1.216 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Carthage+mvvm

CARTHAGE+MVVM

YURU-HUWA LT 2015-12-11 KHANEDA@JUMBOS5

Page 2: Carthage+mvvm

CARTHAGE

Page 3: Carthage+mvvm

CARTHAGE

なんなのか?▸ cocoapodsに変わる新しいiOSのパッケージ管理ツール

▸ 分散型依存性管理フレームワークとも言われている

Page 4: Carthage+mvvm

CARTHAGE

COCOAPODSとのちがいは?

▸ そもそもの哲学から違うcarthage

$ pod install$ carthage update

+ +

WORKSPACEは LIBを管理するる

PROJは LIBを管理しない

Podspec

Page 5: Carthage+mvvm

CARTHAGE

COCOAPODSとのちがいは?

▸ 哲学から違いからうまれるちがいcarthage

分散型 集約型‣ iOS8からのみ

Dynamic Frameworkを使うため

‣ Dynamic Frameworkなのでビルドが早い余計なビルドがない

‣ 変にprojファイルをいじらないので健全

‣ Podspec fileが必要

‣ workspaceがごちゃごちゃしている

‣ でもworkspaceはライブラリが管理しやすい

‣ まだメジャー

Page 6: Carthage+mvvm

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

Page 7: Carthage+mvvm

CARTHAGE

LET’S CARTHAGE!!! BUT …

▸ リポジトリ上のコードがdynamic Framework用のschemeを用意していないといけない

▸ Carthage に対応しているライブラリは Xcode の Shared

Build Scheme を設定しており, この Scheme でビルドすると Framework が出力されるように設定されています.

https://github.com/SwiftBond/Bond

Page 8: Carthage+mvvm

CARTHAGE

結論▸ projが綺麗なまま

▸ ビルドも早く

▸ 簡単に使える

▸ 対応していないライブラリにはPull Requestを!

Page 9: Carthage+mvvm

MVVM

Page 10: Carthage+mvvm

MVVM

なんじゃそれ▸ まぁなんとなく

Model ViewViewModelだというのはわかる。

知りたいのは

▸ 何が便利?

▸ どう使えばいいの?*関係のないKeynoteのデフォルトの画像

Page 11: Carthage+mvvm

MVVM - なにが便利?

各クラスが公開インスタンス変数を管理することによって、 画面状態の管理を安全に行うアーキテクチャです

ロジック同士のリレーション MVCが準拠される環境でのMVVM

http://rarcher.azurewebsites.net/Post/PostContent/25

Page 12: Carthage+mvvm

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

Page 13: Carthage+mvvm

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

それぞれ特徴が違うが関連の定義付け易さで選べばいいと思う

Page 14: Carthage+mvvm

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

Page 15: Carthage+mvvm

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/

Page 16: Carthage+mvvm

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

Page 17: Carthage+mvvm

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でするべき処理が明確になる

Page 18: Carthage+mvvm

MVVM - なにが便利?

DEMO

▸ APIを叩いて結果をTableViewで表示する

▸ 作ろうと思ったらいい感じのがあったhttps://github.com/SwiftBond/Bond-Demo-App

ListViewController

ListViewModel

ListCellViewModel

ListCellView

ListCellViewModel

ListCellViewModel

UITableView

ListCellView

ListCellViewbind

Page 19: Carthage+mvvm

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 }

Page 20: Carthage+mvvm

まとめ

CARTHAGE, MVVM

▸ どっちも便利

▸ carthage

▸ ビルド時間の短縮

▸ 綺麗なprojファイル

▸ MVVM

▸ Bindで振る舞いを切り分ける