【问题标题】:Swift - Using a closure inside a repeat loopSwift - 在重复循环中使用闭包
【发布时间】: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


【解决方案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.
        }
}

【讨论】:

    【解决方案2】:

    由于该过程是异步的,因此循环将一直运行直到遇到第一个 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

    【讨论】:

    • 你打败了我。 :)
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2018-12-26
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多