Быстрое закрытие, асинхронный порядок выполнения
В моей модели есть функция для извлечения данных, которая ожидает обработчик завершения в качестве параметра:
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
?