我在数据结构中使用@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)
}
}
}
答案 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
}