Pasar y almacenar cierres / devoluciones de llamada en Swift

Me gustaría hacer lo siguiente en código rápido:

Tengo que llamar a mi API para actualizar varios elementos. Entonces llamo a la API para cada elemento de forma asincrónica. Cada llamada a la API ejecuta una función de devolución de llamada cuando se realiza. Estas devoluciones de llamada disminuyen un contador, de modo que cuando el contador llega a 0 sé que todas mis llamadas API se han completado. Cuando el contador llega a 0, me gustaría llamar a una función de devolución de llamada final (una vez, cuando se completen todas las llamadas), para actualizar mi IU y así sucesivamente. Esta devolución de llamada final se pasa a mi servicio al principio y se almacena en una propiedad de clase para su posterior ejecución.

Fuente ejecutable del área de juegos:

// Playground - noun: a place where people can play

class MyService
{
    let api = MyApi()

    var storedFinalCallback: () -> Void = { arg in }
    var queue: Int                      = 0

    func update(items: [String], finalCallback: () -> Void )
    {
        // Count the necessary API calls
        queue               = items.count
        // Store callback for later execution
        storedFinalCallback = finalCallback

        for item in items {
            // Call api per item and pass queueCounter as async callback
            api.updateCall(item, callback: self.callback())
        }
    }

    func callback()
    {
        queue--
        // Execute final callback when queue is empty
        if queue == 0 {
            println("Executing final callback")
            storedFinalCallback()
        }
    }

}

class MyApi
{
    func updateCall(item: String, callback: ())
    {
        println("Updating \(item)")
    }
}

let myItems: [String]     = ["Item1", "Item2", "Item3"]
let myInstance: MyService = MyService()

myInstance.update(myItems, finalCallback: {() -> Void in
    println("Done")
})

El problema es que con este código, la devolución de llamada final se llama en el orden incorrecto.

Aparentemente, la función de devolución de llamada ya está ejecutada y no se ha pasado correctamente. Sin embargo, esta fue la única forma en que pude hacerlo, sin errores de compilación.

Cualquier ayuda sería muy apreciada. He estado atrapado en esto durante dos días.

Respuestas a la pregunta(1)

Su respuesta a la pregunta