Оптимизация Get From Firestore в Swift - PullRequest
0 голосов
/ 09 января 2020

Я получаю информацию о пользователе для его страницы профиля, используя код ниже. Меня беспокоит то, что при любом масштабе масштабирование циклического перебора всех пользователей и проверка идентификатора пользователя приведут к проблемам с производительностью.

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 имеет следующую структуру:

enter image description here

Я уверен, что есть более эффективный способ добраться до указанный пользователь c, не просматривая все документы. У кого-нибудь есть предложения о том, как реализовать это эффективно?

РЕДАКТИРОВАТЬ: Добавление 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!)
                            }
                        }
                    }
                }

            }
        }

    }

}

1 Ответ

2 голосов
/ 09 января 2020

Вы можете получить один документ по его documentId:

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

... при условии, что documentId - это uid (что часто является хорошей идеей). Если это не так, вы можете запросить один документ по одному полю:

db.collection("users").whereField("userId", isEqualTo: uId).getDocuments() {
    // should return 1 document
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...