Ordem de execução assíncrona de fechamento rápido
No meu modelo tem a função de buscar dados que esperam o manipulador de conclusão 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)
})
}
Está chamando outra função que faz carregamento assíncrono de contatos, para o qual estou encaminhando minha conclusão
A chamada defetchMostRecent
com conclusão é assim:
model.fetchMostRecent({(sortedSections: [TableItem]) in
dispatch_async(dispatch_get_main_queue()) {
// update some UI
self.state = State.Loaded(sortedSections)
self.tableView.reloadData()
}
})
Isso às vezes funciona, mas muitas vezes a ordem de execução não é o que eu esperaria. O problema é que, às vezescompletion()
sob// 2
é executado antes do escopo deif
sob// 1
foi terminado.
Por que é que? Como posso garantir que a execução de// 2
é iniciado depois// 1
?