DocumentId包装器无法正常工作

时间:2020-11-06 21:26:41

标签: swift google-cloud-firestore firebase-authentication swiftui

我在数据结构中使用@DocumentId:

struct UserProfile : Codable, Identifiable {
    @DocumentID var id: String? = UUID().uuidString
}

当我尝试访问ID时,会得到一个随机的字母字符串(04F9C67E-C4A5-4870-9C22-F52C7F543AA5),而不是Firestore中的文档名称(GeG23o4GNJt5CrKEf3RS)

要访问documentId,我在ObservableObject中使用以下代码:

    class Authenticator: ObservableObject {
        
        @Published var currentUser: UserProfile = UserProfile()
        @Published var user: String = ""    
    
        func getCurrentUser(viewModel: UsersViewModel) -> String {
            guard let userID = Auth.auth().currentUser?.uid else {
                return ""
            }
            
            viewModel.users.forEach { i in
                if (i.userId == userID) {
                    currentUser = i
                }
            }
                    
            print("userId \(currentUser.id ?? "no Id")")
            print("name \(currentUser.name)")
            
            return userID
        }

其中currentUser是UserProfile结构。 currentUser.name返回正确的值。我在做什么错了?

currentUser是使用以下方法填充的数组的成员:

func fetchData() {
    db.collection("Users").addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot?.documents else {
            print("No documents")
            return
        }
        
        self.users = documents.compactMap { (queryDocumentSnapshot) -> UserProfile? in
            
            return try? queryDocumentSnapshot.data(as: UserProfile.self)
        }
    }
}

2 个答案:

答案 0 :(得分:1)

问题是您正在用新生成的UUID字符串覆盖获取的DocumentID。您应保持未初始化状态,无需手动设置ID。即使有,也应该仅在通过代码创建对象时设置它,而不是从Firestore中解码对象时设置

答案 1 :(得分:1)

UserProfile结构的ID和您在Firestore中的数据的ID是分开的。因此,您会看到随机的字母字符串。

我会像下面那样更改您的结构,并且您可以在初始化并参考documentID时忽略常规的“ id”变量。

struct UserProfile : Codable, Identifiable {
    var id = UUID() // ID for the struct
    var documentID: String // ID for the post in Database
}