onReceive в представлении SwiftUI вызывает бесконечный цикл - PullRequest
1 голос
/ 08 мая 2020

В приложении 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 : это сильно упрощенная версия моей проблемы. В моем приложении модель представления выполняет сетевой запрос на основе настроек пользователя и обновляет состояние представления, такое как отображение сообщения об ошибке или индикатора загрузки.

1 Ответ

0 голосов
/ 08 мая 2020

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

struct HomeView: View {
    @EnvironmentObject var userSettings: UserSettings
    @ObservedObject var viewModel = TestViewModel()

    var body: some View {
        Text(userSettings.setting)
    }
}
...