【问题标题】:Unable to persist 'posts' reference for 'users' in Firebase无法在 Firebase 中为“用户”保留“帖子”参考
【发布时间】:2016-05-04 08:44:15
【问题描述】:

我正在创建一个社交应用程序,它的一个共同方面是密切关注用户发布的帖子。我使用 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 有关。这个初学者将不胜感激任何帮助。

【问题讨论】:

  • 当您向 Firebase 发帖时,您是否登录到 Firebase 仪表板并确保数据确实存在。其次,您是否将任何 onDisconnect 观察者附加到 Firebase 中的任何节点。最后,当用户注销或断开连接时,您向 Firebase 写入任何内容?而且...在登录控制器中,为什么您的 createFirebaseUser 应该用于验证现有用户。
  • 您在哪里实际验证您的用户?另外,澄清一下,数据不会跨设备持续存在。数据存在于 Firebase 中,Firebase 会在观察 Firebase 数据的设备之间启用和同步数据。
  • 嘿@Jay,我已经登录到仪表板并检查了数据的存在。只有用户和帖子之间的关系被“重置”了。而且我的 createFirebaseUser 不在登录控制器中,而是在我用于 Firebase 数据服务的单独文件中。
  • 我在登录控制器中验证了我的用户。检查他是否已经登录或打开登录屏幕。
  • 实际上只有两种方法可以从 Firebase 中删除数据 1) 如果有一个 onDisconnect 观察者附加到该节点(或父节点)和 2) 如果数据设置为 nil。我的猜测是后者,所以可能在退出应用程序或下次登录时,该节点被设置为 nil,这会将其从 Firebase 中删除。你可以测试一下;启动您的应用程序并登录。然后打开您的 Firebase 信息中心。确保有问题的数据出现在仪表板中。然后退出应用程序。如果您看到仪表板中的数据消失了,那么它很可能被设置为 nil。

标签: ios iphone swift firebase


【解决方案1】:

检查您的代码。我在这里发现了一个错字:

var REF_USER_CURRENT:Firebase { 如果让 uid = NSUserDefaults.standardUserDefaults().valueForKey("uid") 为?字符串 {

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

而不是“...childByAppendingPath(did)” 您可能想将“did”更改为“uid”

除此之外,我还没有测试过你的其余代码。

好像您已经观看了制作此应用的标记价格课程。 我也有:)

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多