【发布时间】: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。