【发布时间】:2015-09-10 18:39:45
【问题描述】:
我正在尝试解析一些我使用 Haneke Swift 缓存的数据。我已经缓存了数据并编写了解析器来完成这项工作。此解析器位于名为 AssembleCalendar() 的单独类中。
使用 Haneke 的 example code 进行获取,我已经尝试完全和完全失败从闭包中实际返回一个值。
我的尝试
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 。我尝试了很多很多的解决方案并在线阅读了很多示例,但我无法弄清楚在这种情况下如何从这个闭包中检索一个值。
我的问题
如何让 .fetch() 在我的函数达到 nil 之前返回一个值?
更新:
这是我在上下文中的代码:
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)
}
}
}
【问题讨论】:
-
如果您将 ScheduledItem 数组传递给 init 函数,为什么不将其设置为 classes items 变量,而不是调用函数来获取它们?或者如果您确实需要使用该函数,请在调用 Schedule 的 init 函数之前执行此操作
-
忽略该行,这是临时解决方法的一部分,因此我可以继续开发,我将删除该行
-
我知道您在这里尝试使用工厂方法,但在这种情况下,我认为这不是正确的方法。如果您需要以异步方式获取数据,那么我会在实例化类之前调用它。我会修改我的答案给你看。
-
感谢 Swinny,我正在查看您关于此主题的其他一些有用的答案。
-
没问题,我已经更新了答案以显示可能的解决方案
标签: swift asynchronous closures completionhandler haneke