Вы можете начать с извлечения замыканий в переменные:
let onDocumentsSaved: () -> Void = {
DispatchQueue.main.async {
populateUI()
}
}
let onDocumentsLoaded: (Document) -> Void { document in
saveDocumentsLocal(document, completion: onDocumentsSaved)
}
// continue with other closures, in reverse order of execution
Это очистит ваш отступ, и шаги будут четко видны.Если вы хотите дождаться нескольких шагов (например, нескольких документов) за один шаг, вы можете использовать DispatchGroup
.
Каждый шаг также может быть легко извлечен в функцию, или вы можете заставить свой класс работатькак конечный автомат.
Также рекомендуется объединить связанные методы в служебные методы, например, load и save можно сгруппировать в один метод с помощьюобработчик завершения, например:
func loadUserAndSave(userId, completion)
func loadDocumentsAndSave(userId, completion)
, тогда ваш метод может быть упрощен до (псевдокод):
loadUserAndSave(userId) {
loadDocumentsAndSave {
DispatchQueue.main.async {
populateUI()
}
}
}
Что снова будет намного проще.