Swift 2.2 MVVM представление Модель как изменяемая структура не поддерживает состояние в контроллере представления

Я достаточно осведомлен о разнице между типом значения и ссылочным типом в Swift и знаю, что типы значений предназначены для неизменного использования. Но структуры, в частности, обладают способностью мутировать сами, и это мое дело. Как эффективно использовать эти изменяющиеся типы структурных значений, чтобы они поддерживали свое состояние или изменялись.

Мой вопрос заключается в том, что в дизайне MVVM приложения для iOS модель представления должна быть классом или структурой? Поскольку модель представления содержит модель / список модели, и эти экземпляры модели могут меняться со временем (например, модель представления получает больше экземпляров модели из запроса веб-службы и добавляет в свой массив модели), как модель представления контроллера обновляется с помощью это изменение. Вот псевдо-пример, но сначала некоторые соображения и кратко:

  • Я не использую никаких привязок здесь. (Нет RxSwift).
  • Нет KVO, я использую проектирование делегирования или завершения.

Пример:

  • Контроллер вида имеет экземпляр модели вида. Когда он появляется, он просит модель представления извлечь данные из веб-службы.
  • Просмотр службы запуска модели и получение ответа при закрытии обработчика завершения
  • В этом закрытом представлении модель добавляет несколько экземпляров модели в массив моделей.
  • Модель представления вызывает обработчик завершения контроллера представления, чтобы уведомить об успехе или ошибке запроса на обслуживание.
  • Контроллер представления выполняет некоторую проверку модели представления и затем соответственно выполняет действие пользовательского интерфейса.

Посмотреть модель:

 struct DummyViewModel {

  private var ints:[Int] = []

  var count: Int {
    return ints.count
  }

  init() {}

  mutating func fetchData(completionHandler:(NSError? ) -> Void) {
    Networking.getDataFromRemote() { response in
          self.ints.append(1)
          completionHandler(nil)
    }
  }
}

Контроллер просмотра:

class DummyViewController: UIViewController{
  private var dummyViewModel: DummyViewModel?

  override func viewDidLoad() {
    super.viewDidLoad()

    /// Setup the view model
    dummyViewModel = DummyViewModel()
  }

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    loadData()
  }
}

private extension DummyViewController {

  func loadData() {
    dummyViewModel?.fetchData { error in
        if self.dummyViewModel?.count > 0 {
          print("View model updated")
        } else {
          print("View model is still same")
        }
      }
    }
}

В приведенном выше коде, когда модель представления получает ответ, она добавляет данные в свой массив, но это изменение никогда не передается контроллеру представления, поскольку внутри замыкания обновляется копия модели представления, а не модель контроллера представления. Итак, вопрос в том, как это изменение передается на просмотр контроллера?

Должен ли я вернуть обновленный экземпляр модели представления из замыкания, а в обновлении замыкания контроллера представления - это экземпляр модели представления. Но это также не сработает, так как при закрытии контроллера представления я также буду обновлять копию модели представления.

Как мы должны иметь дело с этим? Один из вариантов - сделать модель представления классом, чтобы все было ссылкой, и мы везде обновляем один и тот же экземпляр. Но как то же самое может случиться с моделью представления и моделью, модели также будут классами. И поскольку основная часть наших приложений - это контроллеры представлений, все модели, которые мы создаем, - это классы. Таким образом, мы действительно не используем силу типов значений здесь.

Какие-либо предложения?

0 ответов

Другие вопросы по тегам