ios - 在 Swift 中优化从 Firestore 获取
问题描述
我正在使用下面的代码获取用户个人资料页面的信息。我担心的是,在任何规模下,循环遍历所有用户并检查 uid 都会导致性能问题。
db.collection("users").getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
if document.get("uid") as! String == uid {
let firstNameDisplay = document.get("firstname")!
let lastNameDisplay = document.get("lastname")!
self.firstName.text = firstNameDisplay as? String
self.lastName.text = lastNameDisplay as? String
}
}
}
}
我的 Firestore 具有以下结构:
我确信有一种更有效的方法可以在不遍历所有文档的情况下访问特定用户。有没有人有关于如何有效实施的建议?
编辑:添加signUpPressed
@IBAction func signUpPressed(_ sender: UIButton) {
//Create the user
if let email = emailTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines), let password = passwordTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) {
let firstName = firstNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
let lastName = lastNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
let emailAddress = emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
Auth.auth().createUser(withEmail: email, password: password) { user, error in
if error != nil {
print("ERIC: Unable to authenticate with Firebase using email")
print(error!)
}
else {
let cleanPassword = self.passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if isPasswordValid(cleanPassword) == false {
print("Password does not meet the requirements! Please revise.")
return
} else {
//Create cleaned versions of data
print("ERIC: Successfully authenticated with Firebase")
if let user = user {
let userData = ["provider": user.user.providerID]
let uid = user.user.uid
self.completeSignIn(id: uid, userData: userData)
let db = Firestore.firestore()
db.collection("users").addDocument(data: ["lastname":lastName,"firstname":firstName,"email":emailAddress,"uid":uid]) { (error) in
if error != nil {
print(error!)
}
}
}
}
}
}
}
}
解决方案
您可以通过其获取单个文档documentId
:
db.collection("users").document(uId).getDocument() { ... }
...假设documentId
是uid
(这通常是个好主意)。如果不是,您可以通过单个字段查询单个文档:
db.collection("users").whereField("userId", isEqualTo: uId).getDocuments() {
// should return 1 document
}
推荐阅读
- javascript - Angular i18n 动态文本
- c# - 如何在 ASP.NET Core MVC 中从 .docs.microsoft.com 获取“.TokenAuthCookies”cookie?
- javascript - 在 javascript 中使用哈希表搜索对象值
- java - SpringBoot @Scheduled 每两次执行之间的随机延迟
- node.js - 在 dialogflow webhook 中设置了响应,但它返回未设置响应
- reactjs - react-bootstrap-typeahead labelKey 打字稿
- javascript - 不同句子的随机组合
- python - 计算抵押贷款 - python 3.8.3
- c# - 如何在 C# 中使用 Imap 过滤来自特定发件人的电子邮件?
- javascript - 如何使用 setInterval 或 setTimeout 在 nodeJS/Javascript 中创建证书监视器/监视器