Рекурсивное веселье c с закрытием внутри - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь сгенерировать уникальный идентификатор пользователя 8 di git в качестве ключа для моего пользователя в моей базе данных Firebase по сравнению с 28 di git, созданным в Firebase.

В функции я хочу создать случайную переменную и затем проверить ее по базе данных, чтобы увидеть, существует ли она. Если он существует в базе данных, я хочу вызывать рекурсивно, пока не будет создан уникальный ключ.

Я пытался

func createUniqueID() -> String {

    let userID = generateUserID()

    let ref = Database.database().reference(withPath: "users")
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.hasChild(userID) {
            return createUniqueID() //errors here
        }
        else {
            return userID //errors here
        }
    })
}

, но я получаю ошибки в обеих обратных линиях при закрытии базы данных "Неожиданное возвращаемое значение в void функции"

Я пытался сделать это как встроенная функция

func wtf() -> String {

    let userID = "123456"//generateUserID()

    func doesUserIDExistAlready(userID: String, complete: @escaping(String) -> ()) {

        let ref = Database.database().reference(withPath: "users")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChild(userID) {
                complete( self.wtf() )
            }
            else {
                complete( userID )
            }
        })
    }

    doesUserIDExistAlready(userID: userID) { userID in
        return userID //warning here
    }
}

, но я получаю предупреждение о том, что "выражение типа 'String' не используется" при возврате userID

Я также пытался использовать встроенную функцию без завершения, но возвращая строка

func wtf2() -> String {

    let userID = "123456"//generateUserID()

    func doesUserIDExistAlready(userID: String) -> String {

        let ref = Database.database().reference(withPath: "users")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChild(userID) {
                return self.wtf2() //errors here
            }
            else {
                return userID //errors here
            }
        })
    }

    return doesUserIDExistAlready(userID: userID)
}

, но я также получаю ошибки на обеих обратных линиях в закрытии пожарной базы "Неожиданное возвращаемое значение в void функции"

это возможно сделать?

1 Ответ

2 голосов
/ 08 апреля 2020

Запрос Firebase для данных является асинхронной операцией , поэтому createUniqueID не может немедленно вернуть String. Вы можете принять закрытие completion, чтобы "вернуть" идентификатор вызывающей стороне (точно так же, как observeSingleEvent использует закрытие, чтобы дать вам значение).

func createUniqueID(_ completion: (String) -> Void) {

    let userID = generateUserID()

    let ref = Database.database().reference(withPath: "users")
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.hasChild(userID) {
            createUniqueID(completion)
        }
        else {
            completion(userID)
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...