如何 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)
}
我正在尝试解析我使用 Haneke Swift 缓存的一些数据。我已经缓存了数据并编写了解析器来完成此操作。这个解析器位于一个名为 AssembleCalendar()
.
使用 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)
}