2016-05-04 163 views
0

我正在創建一個社交應用,它的一個共同方面是保留用戶製作的帖子的標籤。我使用火力地堡作爲後臺爲此,這裏是我的架構無法在Firebase中爲'用戶'保留'帖子'參考

SocialApp 
posts 
    -KGsBG5TPYBtzRivZnbf 

    users 
    facebook:10154108240254134 
     cachedProfile 
     displayName: "Karthik Kannan" 
     imageURL: "https://scontent.xx.fbcdn.net/v/t1.0-1/p100x100..." 
     posts 
     -KGsBG5TPYBtzRivZnbf: true 
     provider: "facebook" 

當我繼續前進,從一個設備(或模擬器)添加帖子這個工作按計劃進行,但是當我從設備上刪除應用程序,並重新安裝它,用戶字典中的帖子關係消失。我希望它能夠在各種設備上持續存在,並保持關係完好無損,因此如果用戶決定使用其他iDevice登錄他的帖子,則不會孤兒。
下面是我寫的用於向Firebase添加帖子的代碼以及我目前如何跟蹤用戶的代碼。

func postToFirebase(imgUrl: String) { 
    var gift: Dictionary<String, AnyObject> = [ 
     "giftName": giftName.text!, 
     "giftDescription":giftDescription.text!, 
     "giftAvailableAt": giftAvailableAt.text!, 
     "giftPrice": Int(giftPrice.text!)!, 
     "username": NSUserDefaults.standardUserDefaults().valueForKey("uid")!, 
     "giftImage":imgUrl, 
    ] 

    let firebasePost = DataService.ds.REF_POSTS.childByAutoId() 
    firebasePost.setValue(gift) 

    firebasePost.observeSingleEventOfType(.Value, withBlock: { snapshot in 
     if let postID = snapshot.key { 
      DataService.ds.REF_USER_CURRENT.childByAppendingPath("posts").childByAppendingPath(postID).setValue(true) 
     } 

    }) 
    } 

這是我如何設置當前用戶:

var REF_USER_CURRENT:Firebase { 
    if let uid = NSUserDefaults.standardUserDefaults().valueForKey("uid") as? String { 

     let user = Firebase(url:"\(BASE_URL)").childByAppendingPath("users").childByAppendingPath(did){ 
      return user! 
     } else { 
      return Firebase() 
     } 
    } 

    func createFirebaseUser(uid:String, user:Dictionary<String, AnyObject>) { 

     REF_USERS.childByAppendingPath(uid).setValue(user) 
    } 

這是我的登錄控制器的代碼。

 NSUserDefaults.standardUserDefaults().setValue(authData.uid, forKey: "uid") 

     let user = ["provider":authData.provider!,"displayName":authData.providerData["displayName"]!,"cachedProfile":authData.providerData["cachedUserProfile"]!, "imageURL":authData.providerData["profileImageURL"]!] 

     DataService.ds.createFirebaseUser(authData.uid, user: user) 

     self.performSegueWithIdentifier("loggedIn", sender: nil) 

這是我寫的所有代碼。我懷疑這與NSUserDefaults有關。任何幫助將不勝感激這個初學者。

+0

當您向Firebase寫信時,是否登錄到您的Firebase儀表板並確保數據實際存在。其次,您是否將任何onDisconnect觀察者連接到了Firebase中的任何節點。最後,當用戶註銷或斷開連接時,您會向Firebase寫入任何內容?並且...在登錄控制器中,爲什麼使用createFirebaseUser來驗證現有用戶? – Jay

+0

你在哪裏實際驗證你的用戶?另外,爲了澄清,數據不會跨設備持續存在;數據存在於Firebase中,Firebase支持並同步觀察Firebase數據的設備中的數據。 – Jay

+0

嗨@Jay,我已登錄儀表板並檢查數據的存在。這只是用戶和已被「重置」的帖子之間的關係。我的createFirebaseUser不在登錄控制器中,而是在用於Firebase數據服務的單獨文件中。 –

回答

0

檢查您的代碼。我發現了一個錯字這裏:

VAR REF_USER_CURRENT:火力地堡{ 如果讓UID = NSUserDefaults.standardUserDefaults()valueForKey( 「UID」)作爲?字符串{

let user = Firebase(url:"\(BASE_URL)").childByAppendingPath("users").childByAppendingPath(did){ 
     return user! 
    } else { 
     return Firebase() 
    } 
} 

而不是 「... childByAppendingPath(DID)」 你可能想改變 「做」 到 「UID」

除此之外,我還沒有測試出來休息的代碼。

看起來像你看過馬克價格課程,製作這個應用程序。 我也一樣:)