从 firestore 获取 doc
Posted
技术标签:
【中文标题】从 firestore 获取 doc【英文标题】:Geting doc from the firestore 【发布时间】:2021-07-19 02:35:11 【问题描述】:您好,我的代码有问题,想看看是否有人可以帮助我。我遇到的问题是我试图从 Firestore 的用户集合中获取用户,这是因为要显示用户的个人资料,我需要用户文档。
在这里,您可以看到我是如何获取文档的,直到一切正常,然后我输入它,当我单击按钮时,它会打印 user.username (userDoc.username)。当我按下按钮时,如果它在控制台中为我提供了正确的用户名,但是当我尝试将用户(userDoc)传递给我的 profileView 时,我得到一个错误。它告诉我它找不到 userDoc。
为什么?
Button(action:
showProfilePost.toggle()
let docRef = Firestore.firestore().collection("users").document(viewModel.post.ownerUid)
docRef.getDocument snapshot, _ in
// let userDoc = snapshot?.data(as: User.self)
guard let userDoc = try? snapshot?.data(as: User.self) else return
// let userDoc = try? snapshot?.data(as: User.self)
// let userDoc = snapshot!.data(as: User.self)
// dataToDisplay = userDoc
print("\(userDoc.username)")
, label:
Text("by \(viewModel.post.ownerUsername)")
).sheet(isPresented: $showProfilePost, content:
ProfileView(user: userDoc)
// Text(dataToDisplay.username)
)
在这里你可以看到我正在尝试获取的文档:
用户结构:
struct User: Identifiable, Decodable
let username: String
@DocumentID var id: String?
谢谢
【问题讨论】:
【参考方案1】:您将“userDoc”声明为局部变量,这将无法在其范围之外访问。 您已经在尝试使用“dataToDisplay”。使用它,并触发 当你有数据时,表格是这样的:
Button(action:
let docRef = Firestore.firestore().collection("users").document(viewModel.post.ownerUid)
docRef.getDocument snapshot, _ in
// let userDoc = snapshot?.data(as: User.self)
guard let userDoc = try? snapshot?.data(as: User.self) else return // <-- local var
// let userDoc = try? snapshot?.data(as: User.self)
// let userDoc = snapshot!.data(as: User.self)
dataToDisplay = userDoc // <--- here
print("\(userDoc.username)")
self.showProfilePost.toggle() // <--- trigger here
, label:
Text("by \(viewModel.post.ownerUsername)")
)
.sheet(isPresented: $showProfilePost, content:
ProfileView(user: dataToDisplay) // <--- here, not userDoc
// Text(dataToDisplay.username)
)
话虽如此,但在 Button 内对 Firestore 进行异步函数调用并不是一个好主意。重新考虑代码的结构。
【讨论】:
您好,感谢您的回复。这是我的 dataToDisplay 变量:@State var dataToDisplay: User 但我删除了它,因为现在在所有视图中它都需要它,而我只在这个视图中需要它。你好吗以上是关于从 firestore 获取 doc的主要内容,如果未能解决你的问题,请参考以下文章