我创建了一个按钮,可以从在线数据库中重新加载数据。我希望当按钮被按下时,UIButton标题立即从“重置数据”更改为“等待重置...”。数据重新加载代码发生,并且在数据重新加载完成触发时将UIButton
标题更改为“ Reset complete”。
在@IBAction func
下的所有内容返回之前,我无法更改按钮标题,非常感谢您指出了正确的方向。
如果我从resetAllDataFromOnline()
中删除了@IBAction
行,标题将按预期的方式更改,否则,我只能在下载完成后才能完成重置。我也无法在页面上更改单独的标签。
@IBAction func resetDataFromOnlineButtonPressed(_ sender: Any) {
resetDataFromOnlineButton.setTitle("Reset pending...", for: .normal)
resetAllDataFromOnline()
}
func resetAllDataFromOnline() {
DispatchQueue.global(qos: .userInteractive).sync {
NetworkHelperFunctions.updateAnEmptyLocalDatabaseFromOnline(coreDataStack: self.coreDataStack) { (_) in
let newCurrentUser = LoginHelpFunc.checkForValidUserAndLogoutIfNotValid(coreDataStack: self.coreDataStack)
if let newCurrentUser = newCurrentUser {
self.currentUser = newCurrentUser
}
DispatchQueue.main.async {
resetDataFromOnlineButton.setTitle("Reset complete", for: .normal)
}
}
}
}
答案 0 :(得分:2)
sync
中的第一个resetAllDataFromOnline
调用可防止您的操作方法返回。因此,它无法返回到运行循环并更新按钮的视图。您应该改用async
通话。您还应该在后台调用更新操作,以允许并发更新视图:
func resetAllDataFromOnline() {
DispatchQueue.global(qos: .background).async {
...
}
}