Slide 1

Slide 1 text

MVVM(DC): Taming your architecture Esteban Torres - @esttorhe, MobOS, 2017 1

Slide 2

Slide 2 text

Which architecture should I use? Esteban Torres - @esttorhe, MobOS, 2017 2

Slide 3

Slide 3 text

What is the «Problem»? Esteban Torres - @esttorhe, MobOS, 2017 3

Slide 4

Slide 4 text

Not only this but we also lack certain «pieces» along this architectures or lack a clear understanding of where things belong Esteban Torres - @esttorhe, MobOS, 2017 4

Slide 5

Slide 5 text

What DO we have ? Esteban Torres - @esttorhe, MobOS, 2017 5

Slide 6

Slide 6 text

What DO we have? (some of them at least) Esteban Torres - @esttorhe, MobOS, 2017 6

Slide 7

Slide 7 text

MVC Esteban Torres - @esttorhe, MobOS, 2017 7

Slide 8

Slide 8 text

Esteban Torres - @esttorhe, MobOS, 2017 8

Slide 9

Slide 9 text

The «Problem» of MVC Esteban Torres - @esttorhe, MobOS, 2017 9

Slide 10

Slide 10 text

MVC Verdict: By its basic definition not good enough for complex apps Esteban Torres - @esttorhe, MobOS, 2017 10

Slide 11

Slide 11 text

VIPER Esteban Torres - @esttorhe, MobOS, 2017 11

Slide 12

Slide 12 text

VIPER 4 View 4 Interactor (Use Cases) 4 Presenter 4 Entity 4 Router Esteban Torres - @esttorhe, MobOS, 2017 12

Slide 13

Slide 13 text

VIPER Verdict: «Chunky» projects, very testable, clear separation of concerns, sometimes «overly» complex Esteban Torres - @esttorhe, MobOS, 2017 13

Slide 14

Slide 14 text

MVVM Esteban Torres - @esttorhe, MobOS, 2017 14

Slide 15

Slide 15 text

Model Esteban Torres - @esttorhe, MobOS, 2017 15

Slide 16

Slide 16 text

View Esteban Torres - @esttorhe, MobOS, 2017 16

Slide 17

Slide 17 text

ViewModel Esteban Torres - @esttorhe, MobOS, 2017 17

Slide 18

Slide 18 text

ViewModel class MyViewModel { // The model being «formatted» private var model: MyModel? = nil // A formatted property let amountDueText: String { var currencyFormatter = NSNumberFormatter() currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle currencyFormatter.locale = NSLocale.currentLocale() return currencyFormatter.stringFromNumber(model?.amount) ?? 0) } } Esteban Torres - @esttorhe, MobOS, 2017 18

Slide 19

Slide 19 text

What do we have? Esteban Torres - @esttorhe, MobOS, 2017 19

Slide 20

Slide 20 text

MVC Esteban Torres - @esttorhe, MobOS, 2017 20

Slide 21

Slide 21 text

Esteban Torres - @esttorhe, MobOS, 2017 21

Slide 22

Slide 22 text

VIPER Esteban Torres - @esttorhe, MobOS, 2017 22

Slide 23

Slide 23 text

Esteban Torres - @esttorhe, MobOS, 2017 23

Slide 24

Slide 24 text

MVVM Esteban Torres - @esttorhe, MobOS, 2017 24

Slide 25

Slide 25 text

Esteban Torres - @esttorhe, MobOS, 2017 25

Slide 26

Slide 26 text

We DON'T have a place Esteban Torres - @esttorhe, MobOS, 2017 26

Slide 27

Slide 27 text

Esteban Torres - @esttorhe, MobOS, 2017 27

Slide 28

Slide 28 text

¯\_(ϑ)_/¯ What does this mean? Esteban Torres - @esttorhe, MobOS, 2017 28

Slide 29

Slide 29 text

Esteban Torres - @esttorhe, MobOS, 2017 29

Slide 30

Slide 30 text

Let's figure it out using MVVM Esteban Torres - @esttorhe, MobOS, 2017 30

Slide 31

Slide 31 text

Network layer Esteban Torres - @esttorhe, MobOS, 2017 31

Slide 32

Slide 32 text

Esteban Torres - @esttorhe, MobOS, 2017 32

Slide 33

Slide 33 text

!❓ Esteban Torres - @esttorhe, MobOS, 2017 33

Slide 34

Slide 34 text

! Esteban Torres - @esttorhe, MobOS, 2017 34

Slide 35

Slide 35 text

Esteban Torres - @esttorhe, MobOS, 2017 35

Slide 36

Slide 36 text

! Esteban Torres - @esttorhe, MobOS, 2017 36

Slide 37

Slide 37 text

class ViewModelA { private let model: Model var formattedCurrency: String… var formattedProperty1: Double… var formattedProperty2: String… … … init(withModel model: Model) … func getModels(completion:([Model]) -> ()) -> Void { API.request(.GetModels) { jsonResponse in // Parse the JSON response here let models = … completion(models) } } } Esteban Torres - @esttorhe, MobOS, 2017 37

Slide 38

Slide 38 text

! Esteban Torres - @esttorhe, MobOS, 2017 38

Slide 39

Slide 39 text

MVVM …an abstraction of the view exposing public properties and commands… In the view model, the binder mediates communication between the view and the data binder. The view model has been described as a state of the data in the model.1 1 http://wayback.archive.org/web/20080201101909/http:// www.acceptedeclectic.com/2008/01/model-view-viewmodel-pattern-for- wpf.html Esteban Torres - @esttorhe, MobOS, 2017 39

Slide 40

Slide 40 text

DataControllers Esteban Torres - @esttorhe, MobOS, 2017 40

Slide 41

Slide 41 text

Esteban Torres - @esttorhe, MobOS, 2017 41

Slide 42

Slide 42 text

It worked Esteban Torres - @esttorhe, MobOS, 2017 42

Slide 43

Slide 43 text

Esteban Torres - @esttorhe, MobOS, 2017 43

Slide 44

Slide 44 text

class ViewModel { // Hold a reference to our DataController private let dataController: DataController // Hold a reference to the model we will be getting private var model: Model? func getModel(id: Int) -> Observable { return Observable.create { observer in dataController.getModel(id) .subscribe(onNext: { [unowned self] model in self.model = model // If we need to format something else we should do it here observer.onNext(self.model) }, onError: { error in // Maybe properly format the error to the user here as well observer.onError(error) } ).addDisposableTo(disposeBag) } } } Esteban Torres - @esttorhe, MobOS, 2017 44

Slide 45

Slide 45 text

class ViewController: UIViewController { // Retain a reference to our ViewModel private let viewModel: ViewModel func loadData() -> Void { self.viewModel.loadModel() .subscribeOn(MainScheduler.instance) .subscribe(onNext: { [unonwed self] viewModel in // Update your `UI` accordingly self.nameLabel.text = viewModel.formattedName self.amountLabel.tet = viewModel.hopsAmount }, onError: { error in … } }) .addDisposableTo(disposeBag) } } Esteban Torres - @esttorhe, MobOS, 2017 45

Slide 46

Slide 46 text

So… what did we do? ! Esteban Torres - @esttorhe, MobOS, 2017 46

Slide 47

Slide 47 text

Conclusion Esteban Torres - @esttorhe, MobOS, 2017 47

Slide 48

Slide 48 text

«That was the worst idea EVER… BUT seeing how badly they tackled that problem gave me an idea about how to actually make it work.» Esteban Torres - @esttorhe, MobOS, 2017 48

Slide 49

Slide 49 text

Questions? Esteban Torres - @esttorhe, MobOS, 2017 49

Slide 50

Slide 50 text

Thanks Esteban Torres - @esttorhe, MobOS, 2017 50