¿Cómo recargar los datos de UITableView después de que Firebase finalice la descarga de los datos del usuario?

Así que tengo un problema con Firebase porque es asíncrono y no sé cómo trabajar con eso correctamente. Mi aplicación tiene una fuente de productos para la venta, que obtengo de la base de datos de Firebase y el almacenamiento de Firebase (imágenes). El problema es que no sé cuándo o cómo volver a cargar mi UITableView para obtener todos los datos sin obtener un error nulo. Y es aún más complicado, porque primero necesito obtener mi información de post venta de firebase y solo después de eso puedo obtener información de usuario que también está en la celda de vista de tabla.

Así es como obtengo mi venta

    func getSalePosts() -> [SalePost]{

    var salePosts = [SalePost]()

    FIR_DATABASE_SALE_POSTS.queryLimitedToFirst(NUMBER_OF_LOADED_POSTS).observeEventType(.Value, withBlock: { (snapshot) in

        for snap in snapshot.children{

            let imgString = snap.value["image"] as! String!
            let imgNSURL = NSURL(string: imgString)
            let imgNSDATA = NSData(contentsOfURL: imgNSURL!)

            let downloadedImg = UIImage(data: imgNSDATA!)

            let newSalePost = SalePost(title: snap.value["title"] as! String!,
                userUID: snap.value["authorUID"] as! String!,
                postBody: snap.value["body"] as! String!,
                amountAvailable: snap.value["amountAvailable"] as! String!,
                unit: snap.value["unit"] as! String!,
                price: snap.value["price"] as! String!,
                image: downloadedImg!)

            salePosts.append(newSalePost)
            print("num of posts \(salePosts.count)")
        }

    }) { (error) in
            print(error.localizedDescription)
    }

    return salePosts
}

Y esta es la función que está obteniendo UserInfo (obtendré el "userUID" del objeto salePost)

    func getProducer(userUID:String) -> Producer{


    var newProducer:Producer?

    FIR_DATABASE_USERS.child(userUID).observeEventType(.Value, withBlock: { (snap) in

        print(snap.description)

        let imgString = snap.value!["profilePic"] as! String!
        let imgNSURL = NSURL(string: imgString)
        let imgNSDATA = NSData(contentsOfURL: imgNSURL!)
        let downloadedImg = UIImage(data: imgNSDATA!)


        let someProducer = Producer(
            displayName: snap.value!["displayName"] as! String!,
            address: snap.value!["address"] as! String!,
            mobile: snap.value!["mobile"] as! String!,
            email: snap.value!["email"] as! String!,
            password: "",
            bio: snap.value!["bio"] as! String!,
            profilePic: downloadedImg!,
            openingHour: snap.value!["openingHour"] as! String!,
            closingHour: snap.value!["closingHour"] as! String!)

        newProducer = someProducer
        print(newProducer?.description)

        }) { (error) in
            print(error.localizedDescription)
    }

    return newProducer!
}

Entonces, como dije, no sé cuándo, dónde y cómo llamar a estas funciones (en mi controlador de alimentación) para que sea "sincrónico" y para que todos esos datos lleguen a las celdas de la vista de tabla correctamente. Agradeceré toda ayuda. Intenté googlearlo e incluso encontrarlo aquí, pero nada me ayudó.

Respuestas a la pregunta(2)

Su respuesta a la pregunta