როგორ არის განხორციელებული VVM არქიტექტურა თქვენს პროექტში?
sobes.tech AI
პასუხი AI-სგან
პროექტში გამოიყენებოდა MVVM.
კომპონენტები:
-
Model: წარმოადგენს მონაცემებს და ბიზნეს-ლოგიკას. ეს სტრუქტურები ან კლასები არიან, რომლებიც UI-ზე დამოკიდებული არ არიან.
-
View: პასუხისმგებელია მონაცემების ჩვენებაზე და მომხმარებლის შეყვანის დამუშავებაზე. ეს არის
UIViewანUIViewController. View პასიურია, ის მხოლოდ აჩვენებს იმას, რასაც მას უყვება ViewModel. -
ViewModel: მოქმედებს როგორც შუამავალი Model-ის და View-ის შორის. შეიცავს პრეზენტაციურ ლოგიკას და გარდაქმნის Model-ის მონაცემებს იმ ფორმატში, რომელიც სასარგებლოა View-ისთვის. ViewModel უზრუნველყოფს თვალს ადევნებად თვისებებს, რომელზეც View-ი აბონდება. ViewModel-ს პირდაპირი კავშირი View-ისთან არ აქვს.
ურთიერთქმედება:
- View-ი აბონდება ViewModel-ის თვალს ადევნებად თვისებებს.
- ViewModel-ი იღებს მონაცემებს Model-იდან (თუ საჭიროა).
- ViewModel-ი პროცესორობს მონაცემებს და განაახლებს თავის თვალს ადევნებად თვისებებს.
- View-ი იღებს შეტყობინებას ცვლილებაზე და განაახლებს თავის ინტერფეისს.
- View-ი აგზავნის მომხმარებლის მოქმედებებს (მაგალითად, ღილაკის დაჭერას) ViewModel-თან, კლოჩის ან დელეგატის მეშვეობით.
- 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-ს მარტივი შეცვლა ბიზნეს-ლოგიკის ცვლილების გარეშე.