В приложении SwiftUI у меня есть ObservableObject
, который отслеживает пользовательские настройки:
class UserSettings: ObservableObject {
@Published var setting: String?
}
У меня есть модель представления для управления состоянием моего представления:
class TestViewModel: ObservableObject {
@Published var state: String = ""
}
И у меня есть свое мнение. Когда пользовательские настройки меняются, я хочу, чтобы модель представления обновляла состояние представления:
struct HomeView: View {
@EnvironmentObject var userSettings: UserSettings
@ObservedObject var viewModel = TestViewModel()
var body: some View {
Text(viewModel.state)
.onReceive(userSettings.$setting) { setting in
self.viewModel.state = setting
}
}
}
Когда UserSettings.setting
изменяется в другом представлении, это приводит к тому, что onReceive
в моем представлении получает вызвал бесконечный l oop, и я не понимаю почему. Я видел этот вопрос , и это l oop имеет смысл для меня, потому что состояние наблюдаемого ObservableObject
изменяется при наблюдении.
Однако в моем случае я ' m без изменения состояния наблюдаемого объекта (объекта среды). Я наблюдаю за объектом среды и меняю состояние модели представления, которое меняет aws представление.
Перерисовывается ли представление, что вызывает здесь проблему? Вызывается ли onReceive
каждый раз при перерисовке представления?
Есть ли лучший способ выполнить то, что я пытаюсь сделать?
EDIT : это сильно упрощенная версия моей проблемы. В моем приложении модель представления выполняет сетевой запрос на основе настроек пользователя и обновляет состояние представления, такое как отображение сообщения об ошибке или индикатора загрузки.