Список SwiftUI не обновляется при изменении данных в подвиде

#mvvm #swiftui

#mvvm #swiftui

Вопрос:

Я разрабатываю простое приложение в SwiftUI, где я показываю список лиц с возможностью перехода к сведениям о лицах, а затем их редактирования. Для этого я использую две ViewModels PersonListViewModel и PersonViewModel . В основном, PersonListViewModel включает в себя массив PersonViewModel . В моем представлении списка я делаю следующее:

 struct PersonListView: View {
    @EnvironmentObject var personListViewModel: PersonListViewModel
    
    var body: some View {
        NavigationView{
            List{
                ForEach(personListViewModel.personViewModels) { personViewModel in
                    VStack{
                        NavigationLink(destination: PersonDetailView().environmentObject(personViewModel)){
                            Text(personViewModel.person.name)
                        }
                    }
                }
            }
            .navigationBarTitle("Persons")
        }
    }
}
 

На первый взгляд это работает нормально, но если я что-то изменю в представлении PersonDetailView с помощью EnvironmentObject personViewModel , это изменение не отражается при возврате к представлению списка. Однако, если я вернусь к подробному представлению, измененная информация отображается правильно.

Я начинаю сомневаться в своей архитектуре hole MVVM (в основном из-за OO-фона …).

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

Большое спасибо за ваши комментарии.

Комментарии:

1. Использовали ли вы @Published для свойства personViewModels в вашей модели представления?

2. ДА, final class PersonListViewModel: ObservableObject { @Published var personViewModels = [PersonViewModel]()

3. Какие изменения вы делаете в своем источнике? Добавление / удаление записей в массив personViewModels?

4. Я меняю имя пользователя, которое является свойством Person , которое находится в опубликованном var в PersonViewModel : final class PersonViewModel: ObservableObject, Identifiable { @Published var person: Person

5. Это приводит к такой многоуровневой архитектуре, в которой у меня есть PersonListViewModel , которая включает опубликованный массив PersonViewModel , который затем включает саму модель в качестве опубликованного свойства. Что я сейчас задаю вопрос: действительно ли это «Лучшая практика», когда дело доходит до MVVM?