无法在 Firebase 中为“用户”保留“帖子”参考
Posted
技术标签:
【中文标题】无法在 Firebase 中为“用户”保留“帖子”参考【英文标题】:Unable to persist 'posts' reference for 'users' in 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。 【参考方案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”
除此之外,我还没有测试过你的其余代码。
好像您已经观看了制作此应用的标记价格课程。 我也有:)
【讨论】:
以上是关于无法在 Firebase 中为“用户”保留“帖子”参考的主要内容,如果未能解决你的问题,请参考以下文章
Firestore/Firebase - 为关注/关注用户帖子建模数据的方法