Как вернуть значения из асинхронного метода выборки Ханеке

Я пытаюсь проанализировать некоторые данные, которые я кешировал, используя 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)
}
Другие вопросы по тегам