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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage