如何 return 来自 Haneke 的异步获取方法的值

How to return values from Haneke's async fetch method

我正在尝试解析我使用 Haneke Swift 缓存的一些数据。我已经缓存了数据并编写了解析器来完成此操作。这个解析器位于一个名为 AssembleCalendar().

的单独 class 中

使用 Haneke 的 example code 进行获取,我已经尝试完全失败地实际 return 来自闭包的值。

我的尝试

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() 解析器完成。在我的 scheduledItem 收到一个值之前很久,它只是 运行 每行和 returns nil。我尝试了很多很多解决方案并在线阅读了很多示例,但我不知道如何在这种情况下从这个闭包中检索值。

我的问题

如何在我的函数命中 nil 之前将 .fetch() 设为 return 值?


更新:

这是我的上下文代码:

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)
            
        }
    }
}

Fetch() 使用完成处理程序,这意味着其中调用的代码块实际上是在您的 return 语句执行后执行的。这就是为什么它是 returning nil 的原因。要解决此问题,您可以使用自己的完成处理程序来 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)

        }
    }
}

然后使用此初始化 class:

Schedule.getScheduledItems { (items) -> () in
    var schedule = Schedule(items: items)
}