Sobes.tech
Middle+

Jak je ve vašem projektu implementována architektura VVM?

sobes.tech AI

Odpověď od AI

V projektu bylo použito MVVM.

Složky:

  • Model: Představuje data a obchodní logiku. Jsou to struktury nebo třídy nezávislé na UI.

  • View: Odpovídá za zobrazování dat a zpracování vstupu uživatele. Je to UIView nebo UIViewController. View je pasivní, pouze zobrazuje to, co mu říká ViewModel.

  • ViewModel: Funguje jako prostředník mezi Model a View. Obsahuje prezentační logiku a převádí data z Modelu do formátu vhodného pro zobrazení ve View. ViewModel poskytuje pozorovatelné vlastnosti, na které se View přihlašuje. ViewModel nemá přímý odkaz na View.

Interakce:

  1. View se přihlašuje k pozorovatelným vlastnostem ViewModel.
  2. ViewModel získává data z Modelu (je-li potřeba).
  3. ViewModel zpracovává data a aktualizuje své pozorovatelné vlastnosti.
  4. View obdrží oznámení o změnách a aktualizuje svůj rozhraní.
  5. View posílá akce uživatele (například stisknutí tlačítka) do ViewModel přes closures nebo delegáty.
  6. ViewModel zpracovává tyto akce, může komunikovat s Modelem a pokud je potřeba, aktualizovat své pozorovatelné vlastnosti.

Binding (Vazba):

Pro implementaci reaktivní vazby mezi View a ViewModel bylo použito ReactiveSwift (nebo Combine, v závislosti na verzi iOS). To zajišťuje automatickou aktualizaci UI při změnách dat ve ViewModel.

// Příklad ve ViewModel
let title: Property<String>
private let mutableTitle: MutableProperty<String>

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

func loadData() {
    // ...
    mutableTitle.value = loadedData.title
    // ...
}
// Příklad ve View/ViewController
viewModel.title.signal.observeValues { [weak self] title in
    self?.titleLabel.text = title
}

// Odeslání akce uživatele
button.reactive.controlEvents(.touchUpInside).observeValues { [weak self] _ in
    self?.viewModel.buttonTapped()
}

Výhody:

  • Lepší testovatelnost ViewModel.
  • Oddělení odpovědností mezi vrstvami.
  • Snadnější údržba kódu.
  • Snadnější změna UI bez změny obchodní logiky.