2016-05-04 162 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”

除此之外,我还没有测试出来休息的代码。

看起来像你看过马克价格课程,制作这个应用程序。 我也一样:)