Schneller Abschluss asynchrone Ausführungsreihenfolge
In meinem Modell habe ich die Funktion, Daten abzurufen, die einen Completion-Handler als Parameter erwarten:
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)
})
}
Es ruft eine andere Funktion auf, die das asynchrone Laden von Kontakten durchführt und an die ich meine Fertigstellung weiterleite.
Der Anruf vonfetchMostRecent
mit Abschluss sieht so aus:
model.fetchMostRecent({(sortedSections: [TableItem]) in
dispatch_async(dispatch_get_main_queue()) {
// update some UI
self.state = State.Loaded(sortedSections)
self.tableView.reloadData()
}
})
Dies funktioniert manchmal, aber sehr oft ist die Ausführungsreihenfolge nicht so, wie ich es erwartet hätte. Problem ist, dass manchmalcompletion()
unter// 2
wird vor dem Gültigkeitsbereich von @ ausgefühif
unter// 1
wurde beendet
Warum das? Wie kann ich sicherstellen, dass die Ausführung von// 2
wird nach @ gestart// 1
?