У меня есть класс Authenticator
с методом sendEmailForPasswordRecovery
, реализующим вызов asynchronous
, который отправляет электронное письмо пользователю firebase
для восстановления пароля.
func sendEmailForPasswordRecovery(email: String, completion: CallBackWithError) {
FIRAuth.auth()?.sendPasswordResetWithEmail(email, completion: { (error: NSError?) in
completion(error)
})
}
Я звоню этому function
из UIViewController
Authenticator().sendEmailForPasswordRecovery(email, completion: { (error: NSError?) in
print("operation completed. error: \(error)")
self.completion?()
})
Блоки завершения просто вызывают эту функцию. Он просто скрывает представление всплывающее окно, исчезает эффект blurEffect и удаляет его из его родительский вид.
func removeForgotPasswordScreen() {
UIView.animateWithDuration(0.5, animations: {
self.blurEffectView.alpha = 0
self.containerForEmail.alpha = 0
}) { (_: Bool) in
self.containerForEmail.hidden = true
self.blurEffectView.removeFromSuperview()
}
}
но когда выполняется Authenticator().sendEmailForPasswordRecovery
, я вижу, что в консоли ошибка равна нулю. Но всплывающее окно исчезает только через 40-50 секунд. Но когда я заключаю завершение в dispatch_async
, я сразу получаю результат.
Authenticator().sendEmailForPasswordRecovery(email, completion: { (error: NSError?) in
// self.completion?() <----- this was causing delay
dispatch_async(dispatch_get_main_queue(), {
self.completion?() <------ Now it updates immidiately
})
})
Firebase sendPasswordResetWithEmail
имеет подпись:
public func sendPasswordResetWithEmail(email: String, completion: FIRSendPasswordResetCallback?)
и это говорит
завершение @param Необязательно; блок, который вызывается после завершения запроса. Вызывается асинхронно в основном потоке в будущем.
Чего я не понимаю, так это почему всплывающее окно исчезало после определенной задержки в первую очередь и как dispatch_assync
сделал свою работу немедленно.