Sobes.tech
Middle+

როგორ არის განხორციელებული VVM არქიტექტურა თქვენს პროექტში?

sobes.tech AI

პასუხი AI-სგან

პროექტში გამოიყენებოდა MVVM.

კომპონენტები:

  • Model: წარმოადგენს მონაცემებს და ბიზნეს-ლოგიკას. ეს სტრუქტურები ან კლასები არიან, რომლებიც UI-ზე დამოკიდებული არ არიან.

  • View: პასუხისმგებელია მონაცემების ჩვენებაზე და მომხმარებლის შეყვანის დამუშავებაზე. ეს არის UIView ან UIViewController. View პასიურია, ის მხოლოდ აჩვენებს იმას, რასაც მას უყვება ViewModel.

  • ViewModel: მოქმედებს როგორც შუამავალი Model-ის და View-ის შორის. შეიცავს პრეზენტაციურ ლოგიკას და გარდაქმნის Model-ის მონაცემებს იმ ფორმატში, რომელიც სასარგებლოა View-ისთვის. ViewModel უზრუნველყოფს თვალს ადევნებად თვისებებს, რომელზეც View-ი აბონდება. ViewModel-ს პირდაპირი კავშირი View-ისთან არ აქვს.

ურთიერთქმედება:

  1. View-ი აბონდება ViewModel-ის თვალს ადევნებად თვისებებს.
  2. ViewModel-ი იღებს მონაცემებს Model-იდან (თუ საჭიროა).
  3. ViewModel-ი პროცესორობს მონაცემებს და განაახლებს თავის თვალს ადევნებად თვისებებს.
  4. View-ი იღებს შეტყობინებას ცვლილებაზე და განაახლებს თავის ინტერფეისს.
  5. View-ი აგზავნის მომხმარებლის მოქმედებებს (მაგალითად, ღილაკის დაჭერას) ViewModel-თან, კლოჩის ან დელეგატის მეშვეობით.
  6. ViewModel-ი პროცესორობს მოქმედებებს, შეიძლება ურთიერთქმედებდეს Model-თან და საჭიროების შემთხვევაში განაახლოს თავისი თვალს ადევნებად თვისებები.

ბმული (Binding):

გამოყენებული იყო ReactiveSwift (ან Combine, iOS-ის ვერსიაზე დამოკიდებული) რეაქტიული ბმულის განხორციელებისთვის. ეს უზრუნველყოფს UI-ის ავტომატურ განახლებას მონაცემების ცვლილებისას ViewModel-ში.

// მაგალითი ViewModel-ში
let title: Property<String>
private let mutableTitle: MutableProperty<String>

init(...) {
    self.mutableTitle = MutableProperty("")
    self.title = Property(mutableTitle)
    // ...
}

func loadData() {
    // ...
    mutableTitle.value = loadedData.title
    // ...
}
// მაგალითი View/ViewController-ში
viewModel.title.signal.observeValues { [weak self] title in
    self?.titleLabel.text = title
}

// მომხმარებლის მოქმედების გაგზავნა
button.reactive.controlEvents(.touchUpInside).observeValues { [weak self] _ in
    self?.viewModel.buttonTapped()
}

უპირატესობები:

  • უკეთესი ტესტირების შესაძლებლობა ViewModel-ის.
  • პასუხისმგებლობის განაწილება ფენებს შორის.
  • კოდის უკეთესი შენარჩუნება.
  • UI-ს მარტივი შეცვლა ბიზნეს-ლოგიკის ცვლილების გარეშე.