SwiftUI принудительно ждет в основном потоке - PullRequest
0 голосов
/ 09 июля 2020

Новое представление, в которое я получаю впоследствии, зависит от кэшированной переменной. У меня нет опыта работы с потоками, но я думаю, что машина продолжает работу в основном потоке, в то время как другой поток выполняет функцию "getVIN". Меня не волнует, "спит" ли UI. Есть ли способ заставить его работать так, чтобы он не продолжался до завершения функции "getVIN"?

    func verify() {
        if self.email != "" && self.pass != "" {
            Auth.auth().signIn(withEmail: self.email, password: self.pass) {
                (res, err) in
                if err != nil {
                    print(err!.localizedDescription)
                    self.error = err!.localizedDescription
                    self.alert.toggle()
                    return
                }
                print("success")
                //getVIN, finds a number from a database in Firestore, with the users email, and uploads
                //it to UserDefault
                self.getVIN(email: self.email)
                    UserDefaults.standard.set(true, forKey: "status")
                    UserDefaults.standard.set(self.email, forKey: "email")
                    print(UserDefaults.standard.string(forKey: "email"))
                //when i am finished i get sent to a new View with this function
                //the new View uses the cached email, but the getVIN-function is not finished until after i am redirected to the new page.
                    NotificationCenter.default.post(name: NSNotification.Name("status"), object: nil)
            }
        }
        else {
            self.error = "The information is wrong"
            self.alert.toggle()
        }
    }

1 Ответ

1 голос
/ 09 июля 2020

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

Это псевдокод, но он должен дать вам представление о том, что делать.

@Published var vin = getVin()

// In SwiftUI
if !vin {
  ProgressView()
} else {
  TargetView()
}

Кроме того, метод getVIN должен иметь обработчик завершения, если он работает в фоновом режиме. Обработчик завершения будет выполняться после того, как в этом методе будут выполнены операции с базой данных. Затем вы измените свое представление в обработчике завершения.

К вашему сведению, использование уведомления для изменения представлений в SwiftUI - неправильная практика. По тем же причинам был представлен Combine. Узнайте об этом в этой статье .

...