Передача и хранение замыканий / обратных вызовов в 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")
})
Проблема в том, что с этим кодом окончательный обратный вызов вызывается в неправильном порядке.
По-видимому, функция обратного вызова уже выполнена и не прошла должным образом. Однако это был единственный способ сделать это без ошибок компилятора.
Любая помощь будет очень признательна - я застрял на этом в течение двух дней.