2017-07-16 65 views
0

我有一个函数,它在调用firebase数据库方面有一个函数。Swift评估函数的顺序是什么?

内部函数设置包装函数的变量的值,但我的输出不会注册它。调试时,它看起来像这样以相反的顺序发生。我对swift和firebase很陌生,所以我只是想让我的脑袋围绕这个。

这是我的功能和输出。

func checkIfUsernameExists(inUsername: String) -> String{ 
    var aString = "false" 
    let ref = FIRDatabase.database().reference() 

    ref.child("-KohvyrIikykRsOP0XCx").observeSingleEvent(of: .value , with: {(snapshot) in 
     if snapshot.hasChild(self.username.text!){ 
      print ("*** username already exists") 
      aString = "true" 
     } 
    }) 

    print ("*** value of aString is: ", aString) 
    return aString 
} 

输出为:

*** value of aString is: false 
*** username already exists 

编辑:

我措辞,我的问题糟糕,我认为。

我的意思是要怎么才能在处理收集到的信息之前从Firebase获取回调。我已经反弹,所有博客都指向Async,GCD和Completion处理程序。没有哪一个似乎工作,或者很容易让noob得到他们的头。

不用说,我在这里找到了我的答案。

Firebase Swift 3 Completion handler Bool

这是我用什么:

func checkIfUsernameExists(userid: String, completionHandler: @escaping ((_ exist : Bool) -> Void)) { 


     let ref = FIRDatabase.database().reference() 
     ref.child("-KohvyrIikykRsOP0XCx").observeSingleEvent(of: .value , with: {(snapshot) in 
      if snapshot.hasChild(self.username.text!){ 
       self.usernameCheck = "true" 
       completionHandler(true) 
       } 

      else { 
       self.usernameCheck = "false" 
       completionHandler(true) 
       } 
     }) 
} 
+4

对异步方法调用做一些研究。 – rmaddy

+0

我可以找到这个博客https://medium.com/@wilson.balderrama/how-to-make-a-async-calls-in-serial-in-swift-3-1debc21ff3c4和一些叫异步,但我是两者都失败了。可以哟链接和例子? – Mokadillion

+0

[从块内部返回方法对象](https:// stackoverflow。com/questions/22267865/returns-method-object-from-inside-block) –

回答

0

好像你正在试图从火力数据库中的值。你可能知道。您的Firebase数据库中的数据远程存储。这意味着与从磁盘获取数据相比,您需要相对较多的时间来处理数据。

由于需要这么长时间,firebase API的设计者认为“我们不应该让UI等待并且变得没有响应,而是应该异步获取数据,这样UI不会冻结。”

在你的代码,这个代码块:它已经获取的数据,这是一段时间后,后

if snapshot.hasChild(self.username.text!){ 
    print ("*** username already exists") 
    aString = "true" 
} 

将被执行。由于操作是异步完成的,该功能的其余部分将继续执行,即这一部分:

print ("*** value of aString is: ", aString) 
return aString 

而且在这个阶段关闭尚未执行完毕呢,aString是假的。

这可能听起来不符合直觉,但可以这样想,你在这里调用一个方法 - observeSingleEvent。闭包中的代码是一个参数。您只是告诉方法:“当您完成获取数据时运行此操作”。数据是异步获取的,所以之后的代码首先执行。