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")
}
}
}
}
В приведенном выше коде, когда модель представления получает ответ, она добавляет данные в свой массив, но это изменение никогда не передается контроллеру представления, поскольку внутри замыкания обновляется копия модели представления, а не модель контроллера представления. Итак, вопрос в том, как это изменение передается на просмотр контроллера?
Должен ли я вернуть обновленный экземпляр модели представления из замыкания, а в обновлении замыкания контроллера представления - это экземпляр модели представления. Но это также не сработает, так как при закрытии контроллера представления я также буду обновлять копию модели представления.
Как мы должны иметь дело с этим? Один из вариантов - сделать модель представления классом, чтобы все было ссылкой, и мы везде обновляем один и тот же экземпляр. Но как то же самое может случиться с моделью представления и моделью, модели также будут классами. И поскольку основная часть наших приложений - это контроллеры представлений, все модели, которые мы создаем, - это классы. Таким образом, мы действительно не используем силу типов значений здесь.
Какие-либо предложения?