【发布时间】:2019-02-13 13:36:29
【问题描述】:
我正在尝试实现一个用户注册系统,我需要知道一个用户 ID(随机生成)是否已经分配给另一个用户。为此,我连接了我的 Firebase 数据库并使用 observer() 方法检查生成的 ID 的可用性。
但是,由于 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 变量通过hasChild() 方法设置为false,此循环仍会继续运行。
如何更改代码以便能够捕获test 变量的正确值?
我使用的是 Swift 4.1
谢谢
【问题讨论】:
-
您不能使用重复循环。您需要从闭包中调用您的下一次尝试。
-
您需要指明您使用的是哪个框架。
-
永远不要这样
while。太可怕了。 -
@vadian,你应该解释为什么像这样使用
while是可怕的。 While 循环本身是可以的。问题是使用 while 循环尝试响应异步函数。 -
@DuncanC 好的,更具体地说:一个
while循环每秒轮询某事 100000 次是可怕的。 不要问,要告诉。
标签: ios swift asynchronous closures capture