我如何获取 Firebase 文档的名称? Swift

How do I take the name of the Firebase document? Swift

如何直接从登录用户的信息中获取 Firebase 文档的名称?

基本上我有一个用户集合和一个学位课程集合。

当我使用函数时 GetCorsodiLaurea

我不想在.document("")中手动插入文档名称 但我想直接从用户信息中自动获取文档名称 声明哪个课程连接到用户的字段是“TipoCorso”。 正如您在学位课程集合中所见,“TipoCorso”字段的值

这是函数的代码和 Firebase 数据库的屏幕:

  import SwiftUI
  import Firebase
  import FirebaseFirestoreSwift
  import FirebaseDatabase


  class ProfileViewModel : ObservableObject{
@Published var userInfo = UserModel(Nome: "", Cognome: "", photoURL: "", Nomeintero: "", Corsodilaurea: "", Tipocorso: "")
@Published var userDegree = userDegreeModel(Name: "", TotalSubjects: "")

var ref = Firestore.firestore()
let uid = Auth.auth().currentUser!.uid
let db = Firestore.firestore()



init() {
    fetchUser()
    GetCorsodiLaurea()
}

func fetchUser() {
    
    ref.collection("users").document(uid).getDocument { [self] (doc, err) in guard let user = doc else { return }
    
        
        
        let Nome = user.data()?["Nome"] as! String
        let Cognome = user.data()?["Cognome"] as! String
        let photoURL = user.data()?["photoURL"] as! String
        let Nomeintero = user.data()?["Nomeintero"] as! String
        let Tipocorso = user.data()?["Tipocorso"] as! String
        let Corsodilaurea = user.data()?["Corsodilaurea"] as! String
        
        
        DispatchQueue.main.async {
            self.userInfo = UserModel(Nome: Nome, Cognome: Cognome, photoURL: photoURL, Nomeintero: Nomeintero, Corsodilaurea: Corsodilaurea, Tipocorso: Tipocorso)            }
    }
    
}

func GetCorsodiLaurea() {
    db.collection("DegreeCourses").document(self.userInfo.Tipocorso).getDocument { [self] (doc, err) in guard let DegreeCourses = doc else { return }
    let Name = DegreeCourses.data()?["Name"] as! String
    let TotalSubjects = DegreeCourses.data()?["TotalSubjects"] as! String
        
           // [END doc_reference]
           // [END collection_reference]
    DispatchQueue.main.async {
    self.userDegree = userDegreeModel(Name: Name, TotalSubjects: TotalSubjects)
    }
        
    }

    
}





}

User

DegreeCourses

当您调用 fetchUeser() 函数时,您似乎正在使用特定用户的 Tipocorso 填充 UserModel。

因此在 GetCorsodiLaurea 函数中您可以调用 userInfo 变量中的 Tipocorso 成员。

ref.collection("DegreeCourses").document(self.userInfo.Tipocorso).getDocument { [self] (doc, err) in guard let DegreeCourses = doc else { return }

编辑:您很可能收到错误,因为 fetchUsers() 函数尚未完全完成(因为它正在等待 Firebase 响应)但执行已经完成继续执行 GetCorsodiLaurea() 函数。

要解决此问题,请添加 escaping closure 到 fetchUsers() 函数并在闭包中调用 GetCorsodiLaurea() 函数。这样,编译器就不会尝试异步执行函数。

  import SwiftUI
  import Firebase
  import FirebaseFirestoreSwift
  import FirebaseDatabase


  class ProfileViewModel : ObservableObject{
@Published var userInfo = UserModel(Nome: "", Cognome: "", photoURL: "", Nomeintero: "", Corsodilaurea: "", Tipocorso: "")
@Published var userDegree = userDegreeModel(Name: "", TotalSubjects: "")

var ref = Firestore.firestore()
let uid = Auth.auth().currentUser!.uid
let db = Firestore.firestore()



init() {
    //GetCorsodilaurea() will only get called after fetchUser() is complete
    fetchUser(completion: {
      GetCorsodiLaurea()
    })
    
}

func fetchUser(completion: @escaping () -> Void)) {
    
    ref.collection("users").document(uid).getDocument { [self] (doc, err) in guard let user = doc else { return }
    
        
        
        let Nome = user.data()?["Nome"] as! String
        let Cognome = user.data()?["Cognome"] as! String
        let photoURL = user.data()?["photoURL"] as! String
        let Nomeintero = user.data()?["Nomeintero"] as! String
        let Tipocorso = user.data()?["Tipocorso"] as! String
        let Corsodilaurea = user.data()?["Corsodilaurea"] as! String
        
        //don't do this async
        self.userInfo = UserModel(Nome: Nome, Cognome: Cognome, photoURL: photoURL, Nomeintero: Nomeintero, Corsodilaurea: Corsodilaurea, Tipocorso: Tipocorso)    
        completion()
    }
    
}

func GetCorsodiLaurea() {
    db.collection("DegreeCourses").document(self.userInfo.Tipocorso).getDocument { [self] (doc, err) in guard let DegreeCourses = doc else { return }
    let Name = DegreeCourses.data()?["Name"] as! String
    let TotalSubjects = DegreeCourses.data()?["TotalSubjects"] as! String
        
           // [END doc_reference]
           // [END collection_reference]
    DispatchQueue.main.async {
    self.userDegree = userDegreeModel(Name: Name, TotalSubjects: TotalSubjects)
    }
        
    }

    
}