Swift - 在重复循环中使用闭包

Swift - Using a closure inside a repeat loop

我正在尝试实现一个用户注册系统,我需要知道一个用户 ID(随机生成)是否已经分配给另一个用户。为此,我连接了我的 Firebase 数据库并使用 observer() 方法检查生成的 ID 是否可用。

但是,由于 Firebase 数据库查询是异步运行的,而且我只能在查询 return 后知道结果,所以我无法在调用方法中使用正确的 return 值.

我这里的做法是

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 变量被 hasChild() 方法设置为 false,此循环仍保持 运行。

如何更改代码以便能够捕获 test 变量的正确值?

我正在使用 Swift 4.1

谢谢

由于进程是异步的,循环将 运行 直到命中第一个 test = false ,但我认为你需要这种递归方式直到找到可用的 id

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

你没有说,但我假设你使用的 observe() 函数是异步的,并且会 return 在工作完成之前。正如 PaulW11 所说,您需要在完成处理程序中触发下一轮:

func observeChildren() {
    var id:String
        id = generateId()
        ref.child("\(databaseReferenceName)").observe(.value) { (snapshot) in
            if snapshot.hasChild("\(id)") {
              observeChildren() //recursively call observeChildren again.
        }
}