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