1

我正在尝试解析使用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 收到值之前返回 nil 。我试过了了很多很多解决方案并在线阅读了很多示例,但我无法弄清楚在这种情况下如何从这个闭包中检索一个值。

我的问题

如何在我的函数达到 nil 之前让 .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)
            
        }
    }
}
4

1 回答 1

1

Fetch() 正在使用完成处理程序,这意味着在其中调用的代码块实际上是在执行您的 return 语句之后执行的。这就是它返回 nil 的原因。为了解决这个问题,您可以使用自己的完成处理程序来返回信息:

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)
}
于 2015-09-10T20:16:55.117 回答