[アーキテクチャ]MVVM


MVVM



MVVMモードは、モデル、ビュー、ビューモデルに分けられたアーキテクチャ設計モードである.
  • ユーザは、画面を介して操作し、Command Patternを介してView->View Modelに送信する.
  • ViewModelはModelにデータを要求します.
  • モデルは、要求されたデータを介して更新されたデータをViewModelに転送する.
  • ViewModelは、応答するデータを加工して格納する.
  • ビューは、ViewModelとのデータバインドによって自動的に更新されます.
  • Command Pattern:1つのクラスで複数の機能を実行するために実行する機能を抽象化およびカプセル化するモード
  • データバインディング:ビューが論理から分離されていても、そのうちの1つが変更されると、KVO、Delegation、Functional Reactive Programming、Property Observerメソッドが更新されます.
  • Model

  • の既存モードのモードと同じ役割を果たします.
  • アプリケーションで使用される実際のデータ.
  • ViewModelで加工し、加工したデータをViewModelに転送します.
  • は、ViewModelによって所有され、ViewModelとのデータバインディングによってViewModelの変更を検出し、UIを更新する.
  • のデータをどのように持つかだけを考慮します.
  • struct Person { 
      let firstName: String
      let lastName: String
    }

    View

  • アプリケーションUIコードの階層
  • また、
  • ViewModelからデータを取得し、状況に応じてViewModelを使用する方法もあります.
  • class GreetingViewController: UIViewController {
      var viewModel: GreetingViewModelProtocol! {
        didSet {
          self.viewModel.greetingDidChange = { [unowned self] viewModel in
            self.greetingLabel.text = viewModel.greeting
          }
        }
      }
    
      let showGreetingButton = UIButton()
      let greetingLabel = UILabel()
    
      override func viewDidLoad() {
        super.viewDidLoad()
        self.showGreetingButton.addTarget(self.viewModel, action: "showGreeting", forControlEvents: .TouchUpInside)
      }
    }
    
    // Assembling of MVVM
    let model = Person(firstName: "David", lastName: "Blaine")
    let viewModel = GreetingViewModel(person: model)
    let view = GreetingViewController()
    view.viewModel = viewModel

    View Model

  • 実際の論理
  • モデルを所有しています.
  • ユーザがビューを介して動作更新を行う必要がある場合、モデルを更新し、モデルから情報を取得し、ビューを更新する.
  • // 프로토콜
    protocol GreetingViewModelProtocol: class {
      var greeting: String? { get }
      var greetingDidChange: ((GreetingViewModelProtocol) -> ())? { get set } 
      init(person: Person)
      func showGreeting()
    }
    
    // 뷰모델
    class GreetingViewModel: GreetingViewModelProtocol {
      let person: Person
      var greeting: String? {
        didSet {
          self.greetingDidChange?(self)
        }
      }
    
      var greetingDidChange: ((GreetingViewModelProtocol) -> ())?
    
      required init(person: Person) {
        self.person = person
      }
    
      func showGreeting() {
        self.greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
      }
    }

    n/a.結論

  • の利点
  • ビューコードはビジネスロジックコードから分離され、テストが容易です.
  • の欠点
  • ビューモデルの設計は比較的困難である.
  • ビューの処理が複雑であればあるほど、ビューモデルは膨大になる.
  • 注意:https://velog.io/@sso0022/iOS-MVC-%EC%99%80-MVVM
    https://gwangyonglee.tistory.com/49