Orden de ejecución asíncrono de cierre rápido
En mi modelo, tengo la función de recuperar datos que esperan un controlador de finalización como parámetro:
func fetchMostRecent(completion: (sortedSections: [TableItem]) -> ()) {
self.addressBook.loadContacts({
(contacts: [APContact]?, error: NSError?) in
// 1
if let unwrappedContacts = contacts {
for contact in unwrappedContacts {
// handle constacts
...
self.mostRecent.append(...)
}
}
// 2
completion(sortedSections: self.mostRecent)
})
}
Llama a otra función que realiza la carga asíncrona de contactos, a la que reenvío mi finalización
La llamada defetchMostRecent
con la finalización se ve así:
model.fetchMostRecent({(sortedSections: [TableItem]) in
dispatch_async(dispatch_get_main_queue()) {
// update some UI
self.state = State.Loaded(sortedSections)
self.tableView.reloadData()
}
})
Esto a veces funciona, pero muy a menudo el orden de ejecución no es el que esperaba. El problema es que a vecescompletion()
debajo// 2
se ejecuta antes del alcance deif
debajo// 1
estuvo terminado.
¿Porqué es eso? ¿Cómo puedo asegurar que la ejecución de// 2
se inicia después// 1
?