我正在尝试使用信号量来强制同步Firebase数据查询,以便我可以检查数据库中已有的现有项目。
这是我尝试检索快照并检查重复的代码:
let sem = dispatch_semaphore_create(0)
self.firDB.child("sessions").observeSingleEventOfType(.Value, withBlock: { snapshot in
snap = snapshot
dispatch_semaphore_signal(sem)
} )
// semaphore is never asserted
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER)
var isDuplicate : Bool
repeat {
sID = genCode()
isDuplicate = snap.hasChild(sID)
} while isDuplicate
在这种情况下,我需要等待快照在isDuplicate
循环之前返回,但信号量永远不会从observeSingleEventOfType
块触发。
任何建议都非常感谢。
答案 0 :(得分:3)
您可能会使用completion handler。
func findUniqueId(completion:(uniqueId:String)->()) {
self.firDB.child("sessions").observeSingleEventOfType(.Value, withBlock: { snapshot in
var sID = self.genCode()
while snapshot.hasChild(sID) {
sID = self.genCode()
}
completion(uniqueId:sID)
})
}
然后,您将实现您期望的
findUniqueId(){ (uniqueId:String) in
// this will only be called when findUniqueId trigger completion(sID)...
print(uniqueId)
// proceed with you logic...
}