我正在使用 HanekeSwift 检索缓存的数据,然后在每次视图出现时将其设置为 swipeView 中的标签。我的代码检索数据没有问题,但是因为cache.fetch()
是异步的,所以当我调用我的方法来更新视图时,我的标签设置为nil
. 无论如何要告诉 swift 在加载视图之前等到我的缓存数据被检索到?
请参见下面的代码:
override func viewWillAppear(animated: Bool) {
updateEntries() // updates entries from cache when view appears
}
func updateEntries() {
guard let accessToken = NSUserDefaults.standardUserDefaults().valueForKey("accessToken") as? String else { return }
guard let cachedEntryKey = String(accessToken) + "food_entries.get" as? String else { return }
cache.fetch(key: cachedEntryKey).onSuccess { data in
...
// if successful, set labels in swipeView to data retrieved from cache
...
dispatch_group_leave(dispatchGroup)
} .onFailure { error in
print(error)
...
// if unsuccessful, call servers to retrieve data, set labels in swipeView to that data
...
dispatch_group_leave(dispatchGroup)
}
}
当我单步执行上述代码时,它总是显示视图,然后进入缓存块。如何使 viewWillAppear() 允许 updateEntries() 完成并且在执行缓存块之前不会退出它?提前致谢!
更新1:
下面的解决方案运行良好,我的调用以正确的顺序进行(我在通知块中的打印语句在缓存检索后执行),但我的视图仅在调用服务器时使用非零值更新它们的标签。也许我在通知组中混入了错误的代码?
override func viewWillAppear(animated: Bool) {
self.addProgressHUD()
updateEntries() // updates entries from cache when view appears
}
func updateEntries() {
guard let accessToken = NSUserDefaults.standardUserDefaults().valueForKey("accessToken") as? String else { return }
guard let cachedEntryKey = String(accessToken) + "food_entries.get" as? String else { return }
let dispatchGroup = dispatch_group_create()
dispatch_group_enter(dispatchGroup)
dispatch_group_async(dispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
cache.fetch(key: cachedEntryKey).onSuccess { data in
...
// if successful, set labels in swipeView to data retrieved from cache
...
} .onFailure { error in
print(error)
...
// if unsuccessful, call servers to retrieve data, set labels in swipeView to that data
...
}
}
dispatch_group_notify(dispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
print("Retrieved Data")
self.removeProgressHUD()
}
}
更新 2:
此外,当我切换视图时,我会在控制台中收到此警告。我想我用上面的代码锁定了主线程
“此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。”