首页 > 解决方案 > 在 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!)
                            }
                        }
                    }
                }

            }
        }

    }

}

标签: iosswiftfirebasegoogle-cloud-firestore

解决方案


您可以通过其获取单个文档documentId

db.collection("users").document(uId).getDocument() { ... }

...假设documentIduid(这通常是个好主意)。如果不是,您可以通过单个字段查询单个文档:

db.collection("users").whereField("userId", isEqualTo: uId).getDocuments() {
    // should return 1 document
}

推荐阅读