djruss70 djruss70 - 4 months ago 46
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
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


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

Any suggestions greatly appreciated.

Answer

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()
        }
        completion(uniqueId:sID)
    })
}

Then you will achieve what you are expecting with

findUniqueId(){ (uniqueId:String) in
    // this will only be called when findUniqueId trigger completion(sID)...
    print(uniqueId)
    // proceed with you logic...
}
Comments