2016-02-28 66 views
0

我剛剛嘗試從我的項目的Firebase檢索數據。例如,在UILabel中顯示Facebook用戶名。我店使用這樣enter image description hereFirebase +迅速檢索用戶數據

那麼Facebook的用戶數據檢索數據:

let ref = Firebase(url:"https://<app-name>.firebaseio.com/users/facebook:10207213459687665/name") 

ref.observeEventType(.Value, withBlock: { snapshot in 

    self.facebookUserName.text = snapshot.value as! String 

}) 

它完美,但它是在一個特定的路徑檢索用戶名非常愚蠢的,因爲這可能是不同的Facebook用戶登錄。

我想就像檢查用戶登錄,並顯示他們的名字或檢查currentUser或任何更聰明的方式做到這一點? 我不知道該怎麼做。

+0

您從Firebase獲取數據的方式並不那麼愚蠢。實際上,我現在要做的和你現在要做的用戶名相同。 我認爲你的問題不在於從firebase獲取用戶數據,而是你在用戶的Facebook賬號登錄時混淆了你的用戶的Facebook ID。 –

+0

你的意思是爲用戶添加一個userID並通過他們的用戶ID檢索數據?我認爲應該有一個「更聰明」的方式來做到這一點。 –

+0

將來,請複製並粘貼Firebase中的數據結構而不是圖片,這樣我們就不必重新鍵入它。 :-) – Jay

回答

0

我發現在http://www.appcoda.com/firebase/

的答案。當我們試圖獲取從當前用戶的數據下面添加以下代碼來存儲UID(創建用戶帳戶時)

NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid") 

分配變量:

var CURRENT_USER_REF: Firebase { 
    let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String 

    let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID) 

    return currentUser! 
} 

實現代碼功能:

<reference>.observeEventType(FEventType.Value, withBlock: { snapshot in 

     let currentUser = snapshot.value.objectForKey("username") as! String 
     <--your code--> 
     print("Username: \(currentUser)") 
     self.currentUsername = currentUser 
     }, withCancelBlock: { error in 
      print(error.description) 
    }) 
} 

那麼我們就可以在陳舊的直接路徑裁判。

2

有100種不同的方式來做到這一點;這裏是在上述幾個

users 
    user_id_0 
    facebook_id: facebook:10207213459687665 
    name: Nicholas 
    user_id_1 
    facebook_id: facebook:12346578912345689 
    name: Frank 

,你會詢問你想要的facebook_id,這將返回子節點(姓名,地址等)的節點和所有。所述user_id_x是火力地堡自動生成的節點名稱(保證是不同的)

ref.queryOrderedByChild("facebook_id").queryEqualToValue("facebook:12346578912345689") 
    .observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in 
    print(snapshot.value) //prints the facebook_id and Frank 
}) 

另一種選擇是使用相同的數據結構,並觀察節點加載數據。請記住,facebook標識是節點的KEY,而不是值 - .value是鍵:值對。

let ref = Firebase(url:"https://<app-name>.firebaseio.com/users") 
let thisUser = ref.childByAppendingPath("facebook:12346578912345689") 

ref.observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in 

    //snapshot will contain all of the child nodes 
    let userName = snapshot.value.objectForKey("name") 
    self.facebookUserName.text = userName 

}) 

如果你只關心用戶名,您可以通過使用Facebook ID作爲關鍵簡化結構和值將是用戶名:

users  
fb_10207213459687665: Nicholas 
fb_12346578912345689: Frank 

,並與上述檢索觀察代碼,除非您再次使用.value屬性,如您在最初的問題中所述。

在這種情況下,.value屬性是一個字符串,因爲它是唯一的值(因爲您發佈的結構中沒有子節點,所以可能會導致問題,因爲它可能是一系列關鍵字:值對會崩潰)

查詢增加一些開銷,所以觀察的是更有效的。

+0

非常感謝您回答我的問題,但我有一個問題。現在我們實現這個代碼,因爲我們知道facebook_id是「臉譜:12345xxxxxxx」。我只是想知道我們是否可以檢索**當前用戶**用戶名。 –

+0

這三個例子都返回當前的用戶名。請記住,當用戶對Firebase應用進行身份驗證時,會發生三件事。 1)有關用戶的信息將在客戶端設備的回調中返回2)返回的用戶信息包含uid(唯一ID)3)應用程序安全和Firebase規則中auth變量的值已定義。所以一旦auth'd,你有一個用戶的uid,然後可以用來從你的/用戶節點獲取他們的信息。 – Jay

+0

但每個用戶都有不同的「臉譜:123456xxxxx」吧?它如何與不同的用戶一起工作。如果我有10+甚至更多的用戶? –

0

我有同樣的問題。爲了解決這個問題,我創建了一個變量,它會自動引用在登錄的用戶:

class ViewController: UIViewController { 
let UsersRef = Firebase(url:"https://<app-name>.firebaseio.com/users") 

然後,你試圖獲取用戶數據的@IBOutlet下展現出來,寫:

let LoggedInUser = UsersRef.childByAppendingPath("\(UsersRef.authData.uid)") 

當您運行代碼時,「UsersRef.authData.uid」將被當前登錄的用戶的特定ID自動替換。這應該創建到登錄用戶的數據庫信息的直接路徑,而無需手動在參考中輸入用戶的ID。