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.