Бизнес-логика, смешанная с кодом пользовательского интерфейса, является причиной проблем.
Вы можете создать объект модели как @ObjectBinding
следующим образом.
class Model: BindableObject {
var didChange = PassthroughSubject<Void, Never>()
var shouldPresentModal = false {
didSet {
didChange.send(())
}
}
func fetch() {
// Request goes here
// Edit `shouldPresentModel` accordingly
}
}
И представление может быть чем-токак ...
struct ContentView : View {
@ObjectBinding var model: Model
@State var companyID: String = ""
var body: some View {
VStack {
Text("Company ID")
TextField($companyID).textFieldStyle(.roundedBorder)
if (model.shouldPresentModal) {
// presentation logic goes here
}
}.onAppear {
self.model.fetch()
}
}
}
Как это работает:
- Когда появляется
VStack
, вызывается и выполняется функция модели fetch
- Когда запрос успешно выполняется,
shouldPresentModal
устанавливается в значение true, и сообщение отправляется по PassthroughSubject
- . Представление, являющееся подписчиком этого объекта, знает, что модель изменилась, и вызывает перерисовку.
- Если для
shouldPresentModal
установлено значение true, выполняется дополнительный рисунок UI.
Я рекомендую посмотреть этот превосходный доклад WWDC 2019: Поток данных через Swift UI
Это ясно из всего вышеперечисленного.