[英]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.