Помогите разобраться в MVVM


#1

Пытаюсь разобраться “на пальцах” в этой архитектуре на каком -то простом примере. Вот приложение вроде теста, есть ряд вопросов, пользователю нужно на них ответить!

Модель: вопрос и ответ
model

Есть менеджер вопросов: в нем массив с вопросами/ответами, чтение/запись счетчика вопросов в UsedDefaults и метод отдающий вопрос по текущему индексу

В протоколе вопрос и ответ, инициализатор и метод получение следующего вопроса
protocol

ViewModel

Сам контроллер

На контроллере аутлеты лэйбла (для вопроса) и текстового поля (для ответа) и экшены для кнопок
storyboard

1 Главный вопрос: как ViewModel побуждать подавать вопросы в контроллер?
2 Где можно хранить счетчик текущего вопроса (пока что сделал в UserDef)?
3 Где нужно сверять введенный ответ с правильным?
Пункты 2 и 3 я так понимаю делать в контроллере нельзя?


#2
  1. В контроллере инициализируются объект вьюмодели. Далее работаете с ним.
  2. Вся логика работы модели со вью должна быть по идее во вьюмодели.
  3. Странная у вас вьюмодель, как по мне:
  • все методы - это способы достать параметры модели, но ведь достаточно убрать private с объекта модели данных task и напрямую во вьюмодель к нему обращаться:

    let vm = ViewControllerViewModel(task: yourTask)
    vm.task.question
    

Как по мне, так любые общие методы обработки данных модели можно убрать в модель данных. Так как у вас может быть несколько вьюмоделей в зависимости от структуры контроллеров, а какие-то методы обработки данных модели одни и те же (например параметр модели var fullName: String { return firstName + " " + lastName } или ещё какие общие методы)
В каждой вьюмодели у вас будет логика работы вьюмодели со своим вью.


#3

Это же пишем в контроллере? Откуда в контроллере yourTask с текущим Таском? Текущий Таск должен же зайти в контроллер из vm


#4

Я откуда знаю? ))) Это ваши данные. Суть в том, что в контроллере, например в дидЛоад, вы инициализируете вьюмодель, передав туда начальные данные (или создав при инициализации). И дальше с данными работаете во вьюмлодели (vm.task).


#5

Благодарю за совет!
Инициализировал из контроллера вьюмодель и дальше данные уже из вьюмодели приходят, не знаю насколько правильно получилось.


#6

так и должно быть. Всё норм.