MVVM(DC): Taming your architecture

MVVM(DC): Taming your architecture

Everyone is well aware of most of the different architectures available out there and jump here and there trying to be on the «latest and trendiest architecture»; which is ok, sadly though, most of the time we are left with lots of gaps and wondering how exactly our apps fit into this architecture or the other with no clear answer.

This talk will try to help fill some of the gaps in between MVVM via introducing some concepts that even though they are not new; giving them a name and an explanation into how they fit and tie things together helps others understand better a simple yet very helpful architecture like MVVM.

F2f5f7bc8bd3bd71e51d303e9881fe78?s=128

Esteban Torres

February 16, 2017
Tweet

Transcript

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

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

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

    3
  4. 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
  5. What DO we have ? Esteban Torres - @esttorhe, MobOS,

    2017 5
  6. What DO we have? (some of them at least) Esteban

    Torres - @esttorhe, MobOS, 2017 6
  7. MVC Esteban Torres - @esttorhe, MobOS, 2017 7

  8. Esteban Torres - @esttorhe, MobOS, 2017 8

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

    9
  10. MVC Verdict: By its basic definition not good enough for

    complex apps Esteban Torres - @esttorhe, MobOS, 2017 10
  11. VIPER Esteban Torres - @esttorhe, MobOS, 2017 11

  12. VIPER 4 View 4 Interactor (Use Cases) 4 Presenter 4

    Entity 4 Router Esteban Torres - @esttorhe, MobOS, 2017 12
  13. VIPER Verdict: «Chunky» projects, very testable, clear separation of concerns,

    sometimes «overly» complex Esteban Torres - @esttorhe, MobOS, 2017 13
  14. MVVM Esteban Torres - @esttorhe, MobOS, 2017 14

  15. Model Esteban Torres - @esttorhe, MobOS, 2017 15

  16. View Esteban Torres - @esttorhe, MobOS, 2017 16

  17. ViewModel Esteban Torres - @esttorhe, MobOS, 2017 17

  18. 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
  19. What do we have? Esteban Torres - @esttorhe, MobOS, 2017

    19
  20. MVC Esteban Torres - @esttorhe, MobOS, 2017 20

  21. Esteban Torres - @esttorhe, MobOS, 2017 21

  22. VIPER Esteban Torres - @esttorhe, MobOS, 2017 22

  23. Esteban Torres - @esttorhe, MobOS, 2017 23

  24. MVVM Esteban Torres - @esttorhe, MobOS, 2017 24

  25. Esteban Torres - @esttorhe, MobOS, 2017 25

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

    2017 26
  27. Esteban Torres - @esttorhe, MobOS, 2017 27

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

    2017 28
  29. Esteban Torres - @esttorhe, MobOS, 2017 29

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

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

  32. Esteban Torres - @esttorhe, MobOS, 2017 32

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

  34. ! Esteban Torres - @esttorhe, MobOS, 2017 34

  35. Esteban Torres - @esttorhe, MobOS, 2017 35

  36. ! Esteban Torres - @esttorhe, MobOS, 2017 36

  37. 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
  38. ! Esteban Torres - @esttorhe, MobOS, 2017 38

  39. 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
  40. DataControllers Esteban Torres - @esttorhe, MobOS, 2017 40

  41. Esteban Torres - @esttorhe, MobOS, 2017 41

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

  43. Esteban Torres - @esttorhe, MobOS, 2017 43

  44. 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<Model> { 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
  45. 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
  46. So… what did we do? ! Esteban Torres - @esttorhe,

    MobOS, 2017 46
  47. Conclusion Esteban Torres - @esttorhe, MobOS, 2017 47

  48. «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
  49. Questions? Esteban Torres - @esttorhe, MobOS, 2017 49

  50. Thanks Esteban Torres - @esttorhe, MobOS, 2017 50