簡體   English   中英

Swift-在重復循環中使用閉包

[英]Swift - Using a closure inside a repeat loop

我正在嘗試實施一個用戶注冊系統,我需要知道一個用戶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.
        }
}

由於該過程是異步的,因此循環將一直運行到命中第一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM