我非常接近完成项目的这一部分。我学到了很多东西,但就是看不到,总结一下。我想做的是检查电子邮件地址是否已被其他用户使用。为此,我使用了这段代码:
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})
出于某种原因,这将返回空,而不是 true、false 甚至 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/
我试图在一个项目中使用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时
我想为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
尝试通过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.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
如何使用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
我的最终目标是安装当前版本的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
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案