swift - 如何使用 Firestore 获取请求获取特定字段数据?
问题描述
我已经在我的应用上成功设置了 Firebase Phone Auth。
在我的家中,当用户登录时,我检索他的特定 uid 以创建一个以他的 uid 命名的 firestore 文档,以添加有关用户的更多信息。我为每个用户添加了一个“积分”字段。
我正在尝试获取特定的“点”字段值。
有人可以帮我解释一下解决方案吗?我已经知道我们不能仅通过 firestore get 请求获取字段值,但找不到存储“点”值以将其显示给我的用户的解决方案。
非常感谢。
如果需要,这是我的代码:
import SwiftUI
import Firebase
func getUID() -> String {
let user = Auth.auth().currentUser
if let user = user {
return user.uid
}
return "Can't fetch user data."
}
struct HomeView: View {
let uid = getUID()
let db = Firestore.firestore()
var body: some View {
VStack {
Text("User id = \(uid)")
.font(.headline)
.onAppear {
self.db.collection("users").document(self.uid).setData([
"points" : 2
])
}
Button(action: {
let docRef = self.db.collection("users").document(self.uid)
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data()
print(dataDescription)
} else {
print("Document \(document) does not exist")
}
}
}) {
Text("See my points")
}
Button(action: {
try! Auth.auth().signOut()
UserDefaults.standard.set(false, forKey: "status")
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "statusChange"), object: nil)
}) {
Text("Logout")
}
}
}
}
struct HomeView_Previews: PreviewProvider {
static var previews: some View {
HomeView()
}
}
解决方案
有两种方法可以访问 Firestore 文档中的特定字段:
- 该方法返回一个映射到
data()
的字典。您可以像这样读取属性:String
Any
let data = queryDocumentSnapshot.data()
let title = data["title"] as? String ?? ""
let author = data["author"] as? String ?? ""
let numberOfPages = data["pages"] as? Int ?? 0
- 您可以使用 Firestore 的 Codable 支持将文档映射到具有单线的 Swift 结构/类,如下所示:
let book = try? queryDocumentSnapshot.data(as: Book.self)
我建议将任何数据访问代码提取到视图模型或商店中。我链接的文章展示了如何做到这一点。这将使您的代码更易于阅读、不易出错且更易于维护。
推荐阅读
- python - 如何在 Python 中从 IPFS 下载文件
- java - 检查字符串是否是java中的理论文件路径/目录
- php - 从 PHP 创建 XML 文件
- powershell - 匹配除电子邮件地址外的任何内容
- cuda - 如何使 pytorch 中的 cuda 不可用
- ms-access - 如何在 MS Access 中将 gui 语言设置为英语
- c# - 避免向 db:asp.net 插入重复数据
- css - 我通过 iframe 标签使用了一些 youtbe 视频,但问题是当鼠标光标位于 iframe 页面上时,它不会向上和向下滚动
- python - pyspark:在 word2vec 上调用 fit 函数时出现错误 IllegalArgumentException
- javascript - 拦截器Angular 6中的刷新令牌(JWT)