Lets say I have this
// a bunch of code... FIRDatabase.database.reference.child(\"somechild\").observeSingleEventOfType(.Value, withBlock{(snapshot) in
That's indeed how the Firebase Database client works: all network and disk I/O happen off the main thread, then your callbacks/blocks are invoked on the main thread.