在IBAction中的所有代码完成之前,如何更改UIButton的标题?

时间:2018-10-06 09:02:24

标签: ios swift

我创建了一个按钮,可以从在线数据库中重新加载数据。我希望当按钮被按下时,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)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

sync中的第一个resetAllDataFromOnline调用可防止您的操作方法返回。因此,它无法返回到运行循环并更新按钮的视图。您应该改用async通话。您还应该在后台调用更新操作,以允许并发更新视图:

func resetAllDataFromOnline() {
    DispatchQueue.global(qos: .background).async {
        ...
    }
}