草庐IT

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

coder 2023-09-11 原文

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

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/

有关返回 Firebase 用户名时的 iOS 异步任务问题的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  8. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  9. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  10. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

随机推荐