Middle
Pastāsti par MVVM (Model-View-ViewModel) paraugu.
sobes.tech AI
Atbilde no AI
MVC (Model-View-Controller).
| Komponenta | Apraksts | Atbildība |
|---|---|---|
| Modelis | Attēlo datus un biznesa loģiku lietotnē. Nav atkarīgs no View vai ViewModel. | Datu pārvaldība, biznesa noteikumi, saskare ar serveri/datu bāzi. |
| View | Lietotāja interfeiss. Parāda datus un nodod lietotāja darbības ViewModel. Nav iekļauta datu apstrādes loģika. | Informācijas attēlošana, lietotāja notikumu apstrāde (taps, swipes utt.). |
| ViewModel | starpnieks starp Model un View. Nodrošina View ar datiem ērtā formātā un apstrādā lietotāja darbības, sadarbojoties ar Model. Nezina, vai View tiek izmantots vai nē, komunikācija notiek tikai caur datu bindingu. | Datu pārveidošana no Model uz View, lietotāja mijiedarbības apstrāde, biznesa loģika, kas nav saistīta ar UI. |
Galvenie principi:
- Data Binding: Datu sasaistīšana starp View un ViewModel. Kad dati mainās ViewModel, View automātiski tiek atjaunināts, un otrādi.
- Testability: ViewModel ir viegli testējams, jo tas nav atkarīgs no UI karkasa.
- Sadalījums pēc funkcijām: Komponentu lomu skaidra sadale.
Priekšrocības:
- Uzlabota testējamība.
- Tīrāka atbildības sadale.
- Koda bāzes vienkāršošana darbā ar sarežģītiem UI.
Trūkumi:
- Var būt lieks vienkāršām lietojumprogrammām.
- Datu bindinga īstenošana bez ārējiem rāmjiem (piemēram, RxSwift, Combine) ir sarežģīta.
Piemēra struktūra:
// Modelis
struct User {
let name: String
let age: Int
}
// ViewModel
class UserViewModel {
private let user: User
init(user: User) {
self.user = user
}
var displayName: String {
return user.name
}
var displayAge: String {
return "\(user.age) gadi"
}
// Metode lietotāja darbību apstrādei
func userTapped() {
print("Lietotājs \(user.name) ir nospiests")
// Iespējama saskare ar Model vai citu loģiku
}
}
// Skats (UIViewController)
class UserViewController: UIViewController {
private var viewModel: UserViewModel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var ageLabel: UILabel!
func configure(with viewModel: UserViewModel) {
self.viewModel = viewModel
updateUI()
}
private func updateUI() {
// Datu sasaistīšana (piemērs ar roku)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}