从 Firestore 获取文档

时间:2021-07-19 02:35:11

标签: swift firebase google-cloud-firestore swiftui

嗨,我的代码有问题,想看看是否有人可以帮助我。我遇到的问题是我试图从 Firestore 的用户集合中获取用户,这是因为要显示用户的个人资料,我需要用户文档。

在这里您可以看到我如何获取文档,直到一切正常,然后当我单击按钮时,它会打印 user.username (userDoc.username)。当我按下按钮时,如果它在控制台中为我提供了正确的用户名,但是当我尝试将用户 (userDoc) 传递给我的 profileView 时,我收到错误消息。它告诉我它找不到 userDoc。

为什么?

enter image description here

 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)
                                
                            })

在这里你可以看到我试图获取的文档:

User Firestore

用户结构:

struct User: Identifiable, Decodable {
let username: String
 @DocumentID var id: String?
}

谢谢

1 个答案:

答案 0 :(得分:0)

您将“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 进行异步函数调用并不是一个好主意。重新考虑代码的结构。