Вот краткий обзор вашей рассматриваемой функции:
...
context.perform {
entities = try! fetch.execute()
completion(entities)
}
return entities
Swift видит это так:
- Вызовите эту
context.perform
функцию - Вызов
return entities
- Обработка вывода
context.perform
внутри замыкания
Из-за заказа он просто возвращает значение и считает свою работу выполненной.Ваше закрытие, скорее всего, завершится, если предположить, что оно останется в области видимости, но в противном случае из этого ничего не выйдет.
Самое простое было бы изменить вашу функцию с:
@nonobjc public class func fetchEvents(completion: @escaping ([Event]) -> () = { _ in }) -> [Event]
на:
@nonobjc public class func fetchEvents(completion: @escaping ([Event]) -> () = { _ in })
Разница здесь заключается в удалении возврата [Event]
.
Затем внутри вашей функции удалите строку return entities
.
Теперь у вас есть асинхронная функция,поэтому все, что вы используете для вызова, должно использовать закрытие для значения [Event].
self.events = Event.getEventsFromAPI()
становится примерно таким:
Event.getEventsFromAPI() = { [weak self] events in
self?.events = events
}