SwiftUI 强制等待主线程

SwiftUI force wait on main thread

之后我要发送到的新视图取决于缓存的变量。我对线程没有经验,但我认为机器在主线程上继续运行,而另一个线程执行“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()
        }
    }

你可以这样做。您可以将 getVin 的结果存储在 Published 属性 中,然后使用它来加载您要加载的目标视图。

这是一个伪代码,但它应该让您知道该怎么做。

@Published var vin = getVin()

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

另外,如果 getVIN 方法在后台运行,它应该有一个完成处理程序。完成处理程序将在该方法中完成数据库操作后执行。然后您将在完成处理程序中更改您的视图。

仅供参考,在 SwiftUI 中使用通知更改视图是错误的做法。出于完全相同的原因,引入了 Combine。在 this article.

中了解它