Как вернуть значения из асинхронного метода выборки Ханеке
Я пытаюсь проанализировать некоторые данные, которые я кешировал, используя Haneke Swift. Я кэшировал данные и написал парсер для этого. Этот синтаксический анализатор находится в отдельном классе AssembleCalendar()
,
Используя пример кода Haneke для извлечения, я попытался с полной и полной неудачей фактически вернуть значение из замыкания.
Моя попытка
func getScheduledItems() -> [ScheduledItem] {
var scheduledItem = [ScheduledItem]() // initialize array
let cache = Shared.dataCache
cache.fetch(key: "CalendarData").onSuccess { data in
scheduledItem = AssembleCalendar().assimilate(data) // update array
print(scheduledItem) // array returns expected value
}
print(scheduledItem) // array returns nil
return scheduledItem // returns nil
}
Что я знаю
Я понимаю, что это асинхронная проблема. Мой код не ждет моего AssembleCalendar()
парсер до конца. Он просто запускает каждую строку и возвращает ноль задолго до того, как мой scheduleItem получит значение. Я перепробовал множество решений и прочитал немало примеров в Интернете, но не могу понять, как извлечь значение из этого замыкания в этом сценарии.
Мой вопрос
Как я могу получить.fetch() для возврата значения до того, как моя функция достигнет нуля?
Обновить:
Вот мой код в контексте:
class Schedule {
var items : [ScheduledItem]
init() {
items = getScheduledItems() // Schedule.getScheduledItems()
}
func getScheduledItems(completion: (items: [ScheduledItem]) -> ()) {
var scheduledItem = [ScheduledItem]() // initialize array
let cache = Shared.dataCache
cache.fetch(key: "CalendarData").onSuccess { data in
scheduledItem = AssembleCalendar().assimilate(data) // update array
print(scheduledItem) // array returns expected value
completion(items: scheduledItem)
}
}
}
1 ответ
Fetch() использует обработчик завершения, это означает, что вызываемый там блок кода фактически выполняет ПОСЛЕ того, как ваш оператор return был выполнен. Вот почему он возвращается ноль. Чтобы обойти это, вы можете использовать свой собственный обработчик завершения для возврата информации:
class Schedule {
var items = [ScheduledItem]()
init(items: [ScheduledItem]) {
self.items = items
}
class func getScheduledItems(completion: (items: [ScheduledItem]) -> ()) {
var scheduledItem = [ScheduledItem]() // initialize array
let cache = Shared.dataCache
cache.fetch(key: "CalendarData").onSuccess { data in
scheduledItem = AssembleCalendar().assimilate(data) // update array
print(scheduledItem) // array returns expected value
completion(items: scheduledItem)
}
}
}
Затем инициализируйте класс, используя это:
Schedule.getScheduledItems { (items) -> () in
var schedule = Schedule(items: items)
}