Быстрое закрытие, асинхронный порядок выполнения

В моей модели есть функция для извлечения данных, которая ожидает обработчик завершения в качестве параметра:

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)
        })
}

Это вызывает другую функцию, которая выполняет асинхронную загрузку контактов, на которую я пересылаю свое завершение

ЗовfetchMostRecent с завершением выглядит так:

model.fetchMostRecent({(sortedSections: [TableItem]) in
    dispatch_async(dispatch_get_main_queue()) {
        // update some UI
        self.state = State.Loaded(sortedSections)
        self.tableView.reloadData()
    }
})

Иногда это работает, но очень часто порядок исполнения не такой, как я ожидал. Проблема в том, что иногдаcompletion() под// 2 выполняется до объемаif под// 1 было закончено

Это почему? Как я могу обеспечить выполнение// 2 начинается после// 1?

Ответы на вопрос(1)

Ваш ответ на вопрос