Sobes.tech
Middle+

Como é implementada a arquitetura VVM no seu projeto?

sobes.tech IA

Resposta da IA

No projeto foi utilizado MVVM.

Componentes:

  • Modelo: Representa os dados e a lógica de negócio. São estruturas ou classes independentes da UI.

  • View: Responsável por exibir os dados e lidar com a entrada do usuário. É UIView ou UIViewController. A View é passiva, ela apenas exibe o que o ViewModel lhe diz.

  • ViewModel: Atua como intermediário entre o Modelo e a View. Contém a lógica de apresentação e transforma os dados do Modelo em um formato adequado para a exibição na View. O ViewModel fornece propriedades observáveis às quais a View se inscreve. O ViewModel não possui uma referência direta à View.

Interação:

  1. A View assina as propriedades observáveis do ViewModel.
  2. O ViewModel obtém dados do Modelo (se necessário).
  3. O ViewModel processa os dados e atualiza suas propriedades observáveis.
  4. A View recebe a notificação de mudanças e atualiza sua interface.
  5. A View envia ações do usuário (por exemplo, clique de botão) ao ViewModel via closures ou delegados.
  6. O ViewModel processa essas ações, pode interagir com o Modelo e, se necessário, atualizar suas propriedades observáveis.

Binding (Vinculação):

Foi utilizado ReactiveSwift (ou Combine, dependendo da versão do iOS) para implementar a vinculação reativa entre a View e o ViewModel. Isso garante uma atualização automática da UI ao alterar os dados no ViewModel.

// Exemplo no ViewModel
let title: Property<String>
private let mutableTitle: MutableProperty<String>

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

func loadData() {
    // ...
    mutableTitle.value = loadedData.title
    // ...
}
// Exemplo na View/ViewController
viewModel.title.signal.observeValues { [weak self] title in
    self?.titleLabel.text = title
}

// Enviando ação do usuário
button.reactive.controlEvents(.touchUpInside).observeValues { [weak self] _ in
    self?.viewModel.buttonTapped()
}

Vantagens:

  • Melhor testabilidade do ViewModel.
  • Separação de responsabilidades entre camadas.
  • Código mais fácil de manter.
  • Troca de UI mais fácil sem alterar a lógica de negócio.