2016-06-12 3 views
0

У меня есть функция, которая полагается на завершение Handler другой функции. Этот метод завершения должен быть вызван при вызове метода делегата completedLogin. Ниже приведен фрагмент моего кода:Выполнение обработчика завершения при выполнении условия

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 
    } 


} 

Однако, используя время цикла в фоновом потоке кажется очень ресурсоемким способом. Я попытался использовать NSTimer(), но проблема в том, что он выполняет другую функцию, поэтому я больше не могу использовать функцию обратного вызова. Есть ли лучший/ресурсосберегающий способ продолжать проверять это?

+0

Возможно, вы захотите сохранить «completeHandler» в качестве переменной экземпляра и вызвать его явно из «завершенного логина». – luk2302

+0

Я боюсь, что не знаю, как это работает, я пробовал работать над процессом, но не смог. Не могли бы вы дать краткое объяснение, почему и как это будет работать? – 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() 
    } 


} 
Смежные вопросы