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.
}
}
我正在尝试实现一个用户注册系统,我需要知道一个用户 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.
}
}