【问题标题】:SwiftUI Delay on view variable视图变量上的 SwiftUI 延迟
【发布时间】:2021-12-26 00:53:59
【问题描述】:

我有一个类,它有一个函数可以获取用户名以在视图上打印它。 它可以工作,但是我延迟了将近一秒钟,因为没有看到用户名。

这里是类:

   class ViewModel: ObservableObject {


@Published var username: String = ""





func benutzerdaten_accountview (email: String) -> String {
    let db = Firestore.firestore()
    let docRef = db.collection("Nutzer").document(email)
    docRef.getDocument{ (document, error) in
        
        if let document = document, document.exists{
            self.username = (document.data()!["username"] as? String)!
    }
   }
    return username
  }

}

这就是我在视图上打印它的方式:

struct AccountView: View{

@ObservedObject var model = ViewModel()
@Binding var tabSelection: Int
var email: String = (Auth.auth().currentUser?.email)!

var body: some View {
    
        VStack{
            
            Text("Hallo, \(model.benutzerdaten_accountview(email: email).description)")
         ...

【问题讨论】:

  • 如果实际返回了正确的username,我会感到惊讶。从外观上看,我认为它不会从原来的空字符串改变,直到之后。所以返回对于异步闭包中设置的值是没有意义的。
  • 我该如何解决?
  • 我们不在 SwiftUI 中使用视图模型

标签: swift firebase google-cloud-firestore swiftui


【解决方案1】:

benutzerdaten_accountview() 中,您不能返回username,因为它尚未设置。用户名设置在异步闭包中。

已经在回调闭包中设置了username,这很好。您现在需要做的只是调用onAppear(perform:) 中的方法,以便在AccountView 加载时立即显示。

username 的更改将发布更新以再次更新视图,准备就绪时。从 API 获取数据可能需要一些时间,尤其是当您有 cold-starts 时。

首先,删除returnbenutzerdaten_accountview() 方法中的返回类型。这不再需要。其余代码:

struct AccountView: View {
    @ObservedObject var model = ViewModel()
    @Binding var tabSelection: Int
    var email: String = (Auth.auth().currentUser?.email)!

    var body: some View {
        VStack {
            Text("Hallo, \(model.username)")
        }
        .onAppear {
            model.benutzerdaten_accountview(email: email)
        }
    }
}

【讨论】:

  • 成功了。谢谢,但我仍然有这个延迟。在应用程序的第一次启动时,用户名是空白的一整秒
  • @kaan5353 在互联网上调用 API 的本质,以及我提到的冷启动。要在客户端解决此问题,您可以根据需要在本地保存该值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2020-03-26
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多