Раньше я сталкивался с вызовами 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 занимает некоторое время, я хочу дождаться вызова 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...
}
}
}
Кроме того, я добавляю завершение во вторую функцию fetchEvents, но есть ли более чистый код обновить представление коллекции вновь полученными данными из вызова API?
Подробнее здесь: https://stackoverflow.com/questions/690 ... pi-request
Мобильная версия