Ваша функция downloadEvents
должна быть асинхронной, потому что ее вызовы другая асинхронная функция getDataFromServer
.
Решением может быть перемещение части для вычисления событий в асинхронный блок и укажите параметр завершения:
func downloadEvents(completion: @escaping ([Event]) -> ()) {
var events: [Event] = []
var downloadedEvents: [[String: Any]] = []
getDataFromServer(forURL: eventsURL) { result in
downloadedEvents = result
for downloadedEvent in downloadedEvents {
if let event = Event(fromJSON: downloadedEvent) {
events.append(event)
}
}
completion(events)
}
}
Примечание
Ваш код может быть упрощен до:
func downloadEvents(completion: @escaping ([Event]) -> ()) {
getDataFromServer(forURL: eventsURL) { completion($0.compactMap(Event.init(fromJSON:))) }
}