Передача и хранение замыканий / обратных вызовов в Swift

Я хотел бы сделать следующее в быстром коде:

Я должен позвонить в мой API, чтобы обновить несколько пунктов. Поэтому я вызываю API для каждого элемента асинхронно. Каждый вызов API выполняет функцию обратного вызова, когда это сделано. Эти обратные вызовы уменьшают счетчик, поэтому, когда счетчик достигает 0, я знаю, что все мои вызовы API завершены. Когда счетчик достигает 0, я хотел бы вызвать функцию окончательного обратного вызова (один раз, когда все вызовы завершены), чтобы обновить мой интерфейс и так далее. Этот последний обратный вызов вначале передается моему сервису и сохраняется в свойстве класса для последующего выполнения.

Исполняемый источник Playground:

// 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")
})

Проблема в том, что с этим кодом окончательный обратный вызов вызывается в неправильном порядке.

По-видимому, функция обратного вызова уже выполнена и не прошла должным образом. Однако это был единственный способ сделать это без ошибок компилятора.

Любая помощь будет очень признательна - я застрял на этом в течение двух дней.

Ответы на вопрос(1)

Ваш ответ на вопрос