Swift - Использование замыкания внутри повторного цикла - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь внедрить систему регистрации пользователей и мне нужно знать, был ли идентификатор пользователя (сгенерированный случайным образом) уже назначен другому пользователю или нет. Для этого я подключаю свою базу данных Firebase и использую метод observer(), чтобы проверить доступность сгенерированного идентификатора.

Однако, поскольку запрос к базе данных Firebase выполняется асинхронно, и я могу узнать результат только после возврата запроса, я не могу использовать правильное возвращаемое значение из вызывающего метода.

Мой подход здесь

repeat {
  id = generateUniqueId()
  check availability
} while (id is not unique)

У меня есть реализация

var id:String
var test = true
repeat {
    id = generateId()
    ref.child("\(databaseReferenceName)").observe(.value) { (snapshot) in
        test = snapshot.hasChild("\(id)")
    }
} while (test == true)

Этот цикл продолжает работать, даже если для переменной test установлено значение false с помощью метода hasChild().

Как я могу изменить код, чтобы я мог получить правильное значение переменной test?

Я использую Swift 4.1

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

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

func observeChildren() {
    var id:String
        id = generateId()
        ref.child("\(databaseReferenceName)").observe(.value) { (snapshot) in
            if snapshot.hasChild("\(id)") {
              observeChildren() //recursively call observeChildren again.
        }
}
0 голосов
/ 08 сентября 2018

Поскольку процесс асинхронный, цикл будет выполняться, пока не будет достигнут первый test = false, но я думаю, что вам нужен этот рекурсивный способ, пока не будет найден доступный идентификатор

func checkID() {

       id = generateId()
       ref.child("\(databaseReferenceName)").observeSingleEvent(.value) { (snapshot) in
         let test = snapshot.hasChild("\(id)")

         if test {
           print("id exists")
           checkID() // check another one
         }
         else {
          print("this is the one \(id)")
         }
       }

}

Другое дело, что это должно быть observeSingleEvent вместо observe

...