MVVMモードについて


MVVM設計モード


MVVMモードは、既存のMVCモードの問題を解決するために新たに出現した設計モードである.
MVCモードの欠点は,ビューとモデルとの関連性が強く,大きい項目VCほど大きくなることである.
MVVM

ビューとビューモデル、およびモデルからなる新しい設計モデルは、ビューとモデルの間にビューモデルが存在し、ユーザーインタフェースと論理の完全な分離を支援します.
プロセス
  • ビュー(主にViewController)からユーザ動作(テキスト、ボタン等)
  • を入力.
  • ビューモデルでは、現在のモデルに適合する形でデータが加工される.
  • の後、ビューモデルはモデルにデータの更新を要求し、モデルはデータを生成または変更する.
  • モデルでは、データ更新が完了すると、再びビューモデルに通知する
  • に通知する.
  • ビューモデルは、変更されたデータに基づいて自動的にビューを更新します.(Data Binding)
  • サンプルアイテム


    !!これはMVVMモードを理解する適切な例ではないかもしれません.フィードバックを歓迎します!
    View(ViewController)
    ビューに関連付けられたビューコントローラ
    ユーザーがテキストを入力してボタンを押し、入力した上でDogViewModelオブジェクトを生成します.
    @IBAction func ResultPressed(_ sender: UIButton) {
            print("I'm View Controller - ResultPressed")
            let name = nameTextField.text ?? ""
            let age = ageTextField.text ?? "0"
            
            viewmodel = DogViewModel(name: name, breed: selectedBreed, age: Int(age)!)
            
            viewmodel.configure(self)
        }
    ViewModel
    モデル構造でデータを加工するViewModel
    ViewModelオブジェクトを作成し、データ加工後にモデルにデータを渡して更新を要求します.
    class DogViewModel {
        let dog: Dog
        
        init(name: String, breed: String, age: Int) {
            print("I'm DogViewModel - init")
            self.dog = Dog(name: name, breed: breed, age: age)
            (...)
        }
    }
    モデルでデータ更新が完了したら、関数を使用してビューの値を更新できます.
    extension DogViewModel {
        func configure(_ vc: ViewController) {
            print("I'm DogViewModel - configure")
            vc.nameLabel.text = name
            vc.ageLabel.text = ageText
            vc.feeLabel.text = adoptionFeeText
        }
    }
    Model
    実際のデータを含むモデル
    渡された値を使用してデータを生成または変更します.
    class Dog {
        enum Breed {
            case mal
            case pom
            case pug
            case poo
        }
        
        let name: String
        let breed: Breed
        let age: Int
        
        init(name: String, breed: String, age: Int) {
          (...)
        }
    }
        
    例を出力して理解を助ける

    View(View Controller) -> View Model -> Model -> View Model(&View)
    ビューモデルによって仲介されるビューとモデル間のデータ伝達は、独立して開発およびテストできます.