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

标签 ios swift asynchronous closures capture

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

即使 hasChild() 方法将 test 变量设置为 false,此循环仍会继续运行。

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

我正在使用 Swift 4.1

谢谢

最佳答案

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

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

关于ios - Swift - 在重复循环中使用闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52235408/

相关文章:

.NET 异步/等待任务在没有等待的情况下运行

javascript - 在 PhoneGap 中链接 SQLite 调用

ios - 触摸也不起作用?

ios - 符合 MKAnnotation 协议(protocol)的类的自定义方法

ios - Swift 中的 Alamofire 和 base64string

arrays - 我想编写代码来调查我的应用程序的特定条件

java - 出现异常时如何引用原始数据?

ios - Swift:在滑动手势上移动 UIView

android - 面向 iOS、Android 和 WP7 的 Web 应用程序?

ios - 访问容器 View 中的另一个 View Controller 的 IBOutlets