Как представить представление после запроса с URLSession в SwiftUI? - PullRequest
3 голосов
/ 10 июня 2019

Я хочу представить представление после получения данных из запроса, что-то вроде этого

var body: some View {
          VStack {
            Text("Company ID")
            TextField($companyID).textFieldStyle(.roundedBorder)

            URLSession.shared.dataTask(with: url) { (data, _, _) in
                guard let data = data else { return }

                DispatchQueue.main.async {
                    self.presentation(Modal(LogonView(), onDismiss: {
                        print("dismiss")
                    }))
                }
            }.resume()
        }

    }

Ответы [ 2 ]

6 голосов
/ 10 июня 2019

Бизнес-логика, смешанная с кодом пользовательского интерфейса, является причиной проблем.

Вы можете создать объект модели как @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

Это ясно из всего вышеперечисленного.

0 голосов
/ 10 июня 2019

Я думаю, вы можете сделать что-то вроде этого:

var body: some View {
        VStack {
            Text("Company ID")
        }
        .onAppear() {
            self.loadContent()
        }
    }

    private func loadContent() {
        let url = URL(string: "https://your.url")!
        URLSession.shared.dataTask(with: url) { (data, _, _) in
            guard let data = data else { return }
            DispatchQueue.main.async {
                self.presentation(Modal(ContentView(), onDismiss: {
                    print("dismiss")
                }))
            }
            }.resume()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...