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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage