gpt4 book ai didi

返回 Firebase 用户名时的 iOS 异步任务问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:38 25 4
gpt4 key购买 nike

我非常接近完成项目的这一部分。我学到了很多东西,但就是看不到,总结一下。我想做的是检查电子邮件地址是否已被其他用户使用。为此,我使用了这段代码:

func emailCheck(input : String, result:(canRegister: Bool?) -> Void){
var canRegister : Bool?
FIRAuth.auth()?.signInWithEmail(input, password: " "){(user, error) in
if error != nil {
if(error?.code == 17009){
print("Wrong Password")
canRegister = false
}else if(error?.code == 17011){
print("Unknown User")
canRegister = true
}else{
canRegister = false
}
}
}
}

整个 Async 对我来说只有 6 个小时,所以如果您有任何建议,请告诉我。但是当一个按钮被按下时,这个函数就会被调用,只需这样做:

print(emailCheck(emailTxt.text!){(canRegister : Bool?) -> Void in})

出于某种原因,这将返回空,而不是 truefalse 甚至 nil。它只返回 () 但是当我输入正确的密码时它确实返回 Wrong Password ,不太确定这是否相关。有人可以帮忙吗?谢谢大家!

添加信息经过建议,代码和对代码的引用现在是这样的:(只包含重要部分)

class LoginViewController: UIViewController {
@IBAction func nextScreen(sender: UIButton) {
emailCheck(emailTxt.text!) { isValid in
if isValid {
print("Valid!")
} else {
print("Invalid!")
}
}
}
func emailCheck(input: String, callback: (isValid: Bool) -> Void) {
FIRAuth.auth()?.signInWithEmail(input, password: "") { (user, error) in
var canRegister = false

if error != nil {
if (error?.code == 17009) {
//wrong password error
} else if(error?.code == 17011) {
//email doesn't exist
canRegister = true
}
}

callback(isValid: canRegister)
}
}

这背后的过程是,如果返回的code是用户不存在,那么邮箱账号是开放的,可以被拒绝,从而允许canRegister,否则,如果为空传入的密码不正确,那么我们知道该帐户存在,因此无法注册使用。目前,canRegister 返回的值等于此处定义的任何值:

var canRegister = false

回到函数调用。

最佳答案

您正在打印 emailCheck 的返回值,这不是您想要的。异步只是意味着这部分代码将在稍后的某个时间运行。考虑这个简单的函数:

func emailCheck(input: String) -> Bool {
var valid = true

if input.characters.count == 0 {
valid = false
}

return valid
}

这只是检查电子邮件是否有超过零个字符。它可以大大简化,但为了说明差异,我让它变得更加冗长。要使用它,您只需执行如下操作:

let isValid = emailCheck("me@example.com")

if isValid {
print("Valid!")
} else {
print("Invalid!")
}

如果我们希望该方法能够异步工作,我们将为它提供一个回调。回调只是一个函数,可以调用它让我们知道结果是什么,而不是直接由函数返回。这是它的样子:

func emailCheck(input: String, callback: (isValid: Bool) -> Void) {
var valid = true

if input.characters.count == 0 {
valid = false
}

callback(isValid: valid)
}

func callback(isValid: Bool) {
if isValid {
print("Valid!")
} else {
print("Invalid!")
}
}

emailCheck("me@example.com", callback: callback)

请注意,emailCheck 不再返回 一个值,而是实际执行带有结果的回调方法。这还不是真正的异步,因为回调会立即执行,但如果我们愿意,它可以让我们做异步的事情。

Swift 有一些巧妙的语法糖,可以将回调作为最后一个参数传递,而无需像我上面那样显式声明它们。这就是您用于 Firebase 的 signInWithEmail 方法的方法。在此代码中使用它,它看起来像这样:

emailCheck("me@example.com") { isValid in
if isValid {
print("Valid!")
} else {
print("Invalid!")
}
}

它做的事情完全一样,但我认为在这种情况下它看起来更好一些。所以现在我们有一个可以检查电子邮件的良好设置,以及一些可以在我们知道电子邮件是否有效后稍后运行的代码。把它们放在一起:

func emailCheck(input: String, callback: (isValid: Bool) -> Void) {
FIRAuth.auth()?.signInWithEmail(input, password: " ") { (user, error) in
var canRegister = false

if error != nil {
if (error?.code == 17009) {
print("Wrong Password")
} else if(error?.code == 17011) {
print("Unknown User")
canRegister = true
}
}

callback(isValid: canRegister)
}
}


var availableEmail = false

emailCheck("me@example.com") { isValid in
if isValid {
print("Valid!")
} else {
print("Invalid!")
}

availableEmail = isValid
// This prints **second**, and should print `true`, if `isValid` was true.
print(availableEmail)
}

// This prints **first**, and should print `false`, because the callback likely has not run yet.
print(availableEmail)

编辑:请参阅上面的print 代码/注释,说明当您使用回调方法时变量不会立即更新。

附加编辑:另一种构造它的方法,为清楚起见使用另一个函数:

emailCheck("me@example.com") { isValid in
if isValid {
print("Valid!")
} else {
print("Invalid!")
}

self.emailCheckComplete(isValid)
}

func emailCheckComplete(availableEmail: Bool) {
// This is the same as above, but perhaps helps you follow the flow.
print(availableEmail)
}

关于返回 Firebase 用户名时的 iOS 异步任务问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com