同步使用Firebase observeSingleEventOfType

时间:2016-07-07 07:57:46

标签: ios swift firebase firebase-realtime-database

我正在尝试使用信号量来强制同步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块触发。

任何建议都非常感谢。

1 个答案:

答案 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...
}