我不确定您是真的在问一个 SwiftUI 问题,还是只是一个 Firebase 问题,所以我将解决这两个部分。
就从 Firebase 获取特定文档而言,您需要使用比 getDocuments 更具体的查询。具体可以使用document(),并将ID作为参数传递:
Firestore.firestore().collection("Users").document(userID).getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
let fieldValue = document.get("myFieldName") as? Int
let fieldValueType2 = document.data()["myFieldName"] as? Int
} else {
print("Document does not exist")
}
}
(此示例代码基于位于 https://firebase.google.com/docs/firestore/query-data/get-data#swift 的 Firebase 文档
不了解文档中数据的结构,很难确切地说明下一步该做什么,但如果您想将其属性存储在一个变量中,以便在你的观点,你可以设置一个@State 变量:
struct MyView : View {
@State var myData : String = ""
...
//in your firebase callback:
myData = someDataFromTheFirebaseDocument
}
您很可能会发现在Button 回调中存储您的网络逻辑(例如与Firebase 对话)有一些限制和陷阱。可能需要考虑处理这些调用的 ObservableObject 之类的东西,然后您可以从视图中访问 @Published 属性。
一个有限的例子是(注意:只是一个概念性的例子——未经测试的代码):
struct MyView {
@ObservedObject var firebaseConnector = FirebaseConnector()
var body : some View {
VStack {
Button(action: { firebaseConnect.apiCall() }) {
Text("Press me")
}
Text("Firebase data: \(firebaseConnector.dataToDisplay)")
}
}
}
class FirebaseConnector : ObservableObject {
@Published var dataToDisplay : String
func apiCall() {
guard let userID = Auth.auth().currentUser?.uid else { return }
Firestore.firestore().collection("Users").document(userID).getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
self.dataToDisplay = dataDescription
} else {
print("Document does not exist")
}
}
}
}