djruss70 djruss70 - 1 year ago 149
iOS Question

Using Firebase observeSingleEventOfType synchronously

I am trying to use a semaphore to force synchronisation of a Firebase data query so that I can check for an existing item already in the database.

This is the code I have tried to retrieve a snapshot and check for duplicate:

let sem = dispatch_semaphore_create(0)
self.firDB.child("sessions").observeSingleEventOfType(.Value, withBlock: { snapshot in
snap = snapshot
} )
// semaphore is never asserted
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER)

var isDuplicate : Bool
repeat {
sID = genCode()
isDuplicate = snap.hasChild(sID)
} while isDuplicate

In this case I need to wait for a snapshot to return before the
loop, but the semaphore is never fired from the

Any suggestions greatly appreciated.

Answer Source

You might be intersted in using a 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()

Then you will achieve what you are expecting with

findUniqueId(){ (uniqueId:String) in
    // this will only be called when findUniqueId trigger completion(sID)...
    // proceed with you logic...
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download