Schließen und Speichern von Schließungen / Rückrufen in Swift
Ich möchte im Swift-Code Folgendes tun:
Ich muss meine API aufrufen, um mehrere Elemente zu aktualisieren. Daher rufe ich die API für jedes Element asynchron auf. Jeder API-Aufruf führt eine Rückruffunktion aus, wenn er abgeschlossen ist. Diese Rückrufe verringern einen Zähler, sodass ich weiß, dass alle meine API-Aufrufe abgeschlossen sind, wenn der Zähler 0 erreicht. Wenn der Zähler 0 erreicht, möchte ich eine letzte Rückruffunktion aufrufen (einmal, wenn alle Anrufe abgeschlossen sind), um meine Benutzeroberfläche usw. zu aktualisieren. Dieser letzte Rückruf wird zu Beginn an meinen Dienst übergeben und zur späteren Ausführung in einer Klasseneigenschaft gespeichert.
Executable Playground source:
// 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")
})
Das Problem ist, dass mit diesem Code der letzte Rückruf in der falschen Reihenfolge aufgerufen wird.
Anscheinend ist die Rückruffunktion bereits ausgeführt und nicht ordnungsgemäß übergeben. Dies war jedoch die einzige Möglichkeit, die ich ohne Compilerfehler ausführen konnte.
Jede Hilfe wäre sehr dankbar - ich bin jetzt seit zwei Tagen dabei.