2016-03-31 50 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!