Вложенная функция рефакторинга Swift с запросом APIIOS

Программируем под IOS
Ответить
Anonymous
 Вложенная функция рефакторинга Swift с запросом API

Сообщение Anonymous »

Я работаю над вызовами API в Swift, и у меня есть несколько вопросов по этому поводу.
Раньше я сталкивался с вызовами API JavaScript и хотел добавить элементы async/await в свой проект Swift. Но поскольку я использую Swift 5, я пока не могу использовать async/await (я слышал, что могу использовать его из Swift 5.5).
Я пишу функцию для вызовов API и перезагрузки представление коллекции в моем проекте, как показано ниже.

Код: Выделить всё

var events = [Event]()

func populateCV() {
var snapshot = NSDiffableDataSourceSnapshot()

// What I want to do here
1. fetchEvents() // call "fetchEvents" function and get events with API request and update the events array above.
2. snapshot.appendItems(events) // append items (events array) to snapshot variable
3. collectionViewDataSource?.apply(snapshot) // reflect the changes with the new snapshot

}

func fetchEvents() {
// in this function I used Alamofire and I've got the data back (which is "result" below), and I update the events array with results array.
events = results
}
По сути, здесь я хочу обновить массив событий по результату запроса API, а затем добавить обновленные события в снимок, чтобы обновить представление коллекции.
Поскольку запрос API занимает некоторое время, я хочу дождаться вызова snapshot.appendItems(events) и CollectionViewDataSource?.apply(snapshot), пока массив событий не будет полностью обновлен Вызов API.
Итак, я добавляю завершение в fetchEvents и пишу что-то вроде ниже.

Код: Выделить всё

var events = [Event]()

func populateCV() {
var snapshot = NSDiffableDataSourceSnapshot()

fetchEvents {
snapshot.appendItems(self.events)
self.collectionViewDataSource?.apply(snapshot)
}

}

func fetchEvents(completion: @escaping () -> Void) {
// in this function I used Alamofire and I've got the data back (which is "result" below), and I update the events array with results array.
events = results
DispatchQueue.main.async {
completion()
}
}
Сейчас он работает, но мне было интересно, если мне придется работать над несколькими завершениями, мой код станет беспорядочным.
Например, получение данных и использовать данные во вложенной функции, а затем использовать данные, полученные из предыдущей функции... и так далее.
Думаю, в этом случае моя функция станет чем-то вроде

Код: Выделить всё

 fetchEvents {
doTask1 {
doTask2 {
// and more...
}
}
}
Итак, если я хочу избежать этого ада обратных вызовов, как я могу написать завершение в Swift?
Кроме того, я добавляю завершение во вторую функцию fetchEvents, но есть ли более чистый код обновить представление коллекции вновь полученными данными из вызова API?

Подробнее здесь: https://stackoverflow.com/questions/690 ... pi-request
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»