2016-06-12 83 views
0

我有一个函数依赖于另一个函数的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(),但问题是它执行另一个函数,所以我不能再使用我的回调函数。是否有一个更好的/资源友好的方式来检查这一点?

+0

您可能希望将'completionHandler'作为实例变量存储并从'completedLogin'显式调用它。 – luk2302

+0

恐怕我不知道那是如何工作的,我试着用google搜索过程但是失败了。你能否提供一个简短的解释,说明为什么/如何起作用? – Emptyless

回答

1

你必须完成处理程序添加到需要之前,其他像这样要完成的功能:

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 
} 
} 
0
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() 
    } 


}