条件满足时执行完成处理程序
问题描述:
我有一个函数依赖于另一个函数的completionHandler。当调用委托方法completedLogin
时,应该调用completionHandler。以下是我的代码片段:条件满足时执行完成处理程序
class loginClass : LoginScreenDelegate {
var loginCompleted : Bool = false
func performLogin(completionHandler: (() -> Void)) {
...
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
while self.loginCompleted != true {
// Do nothing
}
completionHandler()
})
}
func didLogin(sender: LogInScreen, success: Bool) {
// Do nothing
}
func completedLogin(sender: LogInScreen) {
self.loginCompleted = true
}
}
但是,在后台线程中使用while循环似乎是一种非常耗费资源的方式。我试过使用NSTimer()
,但问题是它执行另一个函数,所以我不能再使用我的回调函数。是否有一个更好的/资源友好的方式来检查这一点?
答
你必须完成处理程序添加到需要之前,其他像这样要完成的功能:
func completedLogin(sender: LogInScreen, completionHandler :(evaluatedSuccessfully: Bool) ->()){
self.loginCompleted = true
completionHandler(evaluatedSuccessfully: true)
}
然后你就可以直接调用这个函数像这样的任何其它功能:
completedLogin(sender: <your sender>){ success in
If success{
//do something
}
else{
//report an error
}
}
答
class loginClass : LoginScreenDelegate {
var loginCompleted : Bool = false
var completionHandler: (() -> Void)!
func performLogin(completionHandler: (() -> Void)) {
...
self.completionHandler = completionHandler
}
func didLogin(sender: LogInScreen, success: Bool) {
// Do nothing
}
func completedLogin(sender: LogInScreen) {
self.loginCompleted = true
self.completionHandler()
}
}
您可能希望将'completionHandler'作为实例变量存储并从'completedLogin'显式调用它。 – luk2302
恐怕我不知道那是如何工作的,我试着用google搜索过程但是失败了。你能否提供一个简短的解释,说明为什么/如何起作用? – Emptyless