2016-03-31 48 views
1

在我的应用程序中,只要它打开,我检查用户是否已经在初始视图的viewdidload中进行了身份验证。如果他们已经通过身份验证,我会对主视图执行一个循环。我甚至在此时将日志打印到日志中,并且打印正确。验证后,Firebase uid返回零(Swift)

override func viewDidLoad() { 
    super.viewDidLoad() 


    if ref.authData != nil { 
     let uid = ref.authData.uid 
     print(uid) 

然后我在应用程序的后面做同样的事情,当他们点击他们的配置文件设置时获取用户的一些信息。我写完全相同的代码,以获取他们的UID,但这次uid将被返回nil并与错误而崩溃

“致命错误:意外发现零而展开的可选值”

这是一个火力点或模拟器问题?

编辑:此问题只发生了两次。否则,代码本身按预期工作,这让我怀疑它是否是火力点或模拟器问题。

回答

1

关于你所遇到我不知道确切的错误,但这样做你的代码(和避免你的错误)的斯威夫特 - 揭掉的办法是拨打:

if let uid = ref.authData.uid { 
    print(uid) 
} 

此代码安全解开两个authData和UID。

+0

太好了,谢谢你,我新,所以我一直在寻找做事的斯威夫特 - 揭掉方式。如果我按照上面的方式做,我可以摆脱if ref.authData!= nil? – FortuneFaded

+1

准确地说,“if let”部分尝试展开(检查它不是“nil”)表达式的每个部分。如果失败,它将停止并且程序的执行继续,而不执行'if'内的部分。 – sschale

+0

真棒,谢谢!对不起,我不认为我可以upvote你的答案,虽然 – FortuneFaded

2

您想使用observeAuthEventWithBlock方法,它是一个实时身份验证侦听器。

override func viewDidAppear() { 
    let ref = Firebase(url: "https://<YOUR-FIREBASE-APP>.firebaseio.com") 

    ref.observeAuthEventWithBlock({ authData in 
    if authData != nil { 
     // user authenticated 
     print(authData) 
     self.performSegueWithIdentifier("LoginToOtherView", sender: nil) 
    } else { 
     // No user is signed in 
    } 
    }) 
} 
+0

什么时候ref.authData.uid超出范围?即,我们可以澄清一下何时使用ref.authData.uid与何时使用rev.observeAuthEventWithBlock? – Jay

+0

通过身份验证后,您可以始终使用'ref.authData',它将包含当前用户。对于您创建的任何参考都是如此。 –

+0

我很抱歉在这里错过了一些东西,但我也检查了ref.authData!= nil,所以我想确保我做的正确。在这种情况下,OP已验证用户已通过身份验证,稍后在同一会话中,该值为零。为什么会使用observeAuthEventWithBlock而不是ref.authData.uid,因为您提到ref.authData总是有效的? – Jay

1

我有这个问题,它花了我几个小时。然后,我意识到,我只是忘了这样做:

ref = FIRDatabase.database().reference() 

var ref: FIRDatabaseReference!