Swift5 - Как дождаться возврата экранирующей асинхронной функции Firestore - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь реализовать проверку имени пользователя в Firestore в моем приложении. У меня есть функция validateTextFields, которая возвращает логическое значение, если проверка текстового поля проходит / не проходит. Я реализую функцию checkUsername, которая использует асинхронные вызовы Firebase для Firestore, чтобы проверить, уникально ли имя пользователя:

func checkUsername(field: String, closure: (Bool) -> Bool) {
        let collectionRef = self.db.collection("Users")
        withoutActuallyEscaping(closure) { [weak self] escapableSnapshot in
            guard self != nil else {return}
            collectionRef.whereField("username", isEqualTo: field).getDocuments { (escapableSnapshot, err) in
                if let err = err {
                    print("Error getting document: \(err)")
                } else if (escapableSnapshot?.isEmpty)! {
                    print("completion is false")
                    //completion(false)
                } else {
                    for document in (escapableSnapshot?.documents)! {
                        if document.data()["username"] != nil {
                            print("completion is true")
                        }
                    }
                }
            }
        }
    }

Я обрабатываю возврат Bool в моей функции validateTextFields():

        checkUsername(field: (usernameTF.text!).lowercased()) { (exists) in
            print(exists)
            if exists {
                print("Username is taken")
                usernameIsTaken = true
            }
            else {
                print("Username is available")
            }
            return true
        }

        if usernameIsTaken { return false }
        print("printing out username", usernameIsTaken)

Я пробовал semaphores и withoutActuallyEscaping(closure), но ни один не помог. Мне интересно, правильно ли я использую функцию withoutActuallyEscaping(), если есть менее хакерский способ сделать это. Если я не понимаю, функция withoutActuallyEscaping - это именно то, что нужно для этого.

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

...