满足条件时执行完成处理程序

Execute completion handler when condition is met

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

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


}

您必须向需要在另一个函数之前完成的函数添加一个完成处理程序,如下所示:

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
}
}