在我的应用程序中,我让用户选择预先制作的头像。在Firebase中,每个用户的化身有两个属性。这些是图像和图像颜色.图像是项目资产,颜色保存为整数,然后转换为颜色。我将用户的图像保存在用户/uid/图像中,将图像颜色保存在用户/uid/图像颜色中。当我读取一个帖子并将每个值添加到我的post模型中时,即使用户更改了他们的图像或颜色,图像和图像颜色也会保持不变。我通过以下查询修复了这个问题:
guard let user = UserService.currentUserProfile else { return }
let ref = Database.database().reference().child("posts").queryOrdered(byChild: "author/uid").queryEqual(toValue: user.uid)
ref.observeSingleEvent(of: .value) { snapshot in
if snapshot.exists() {
print(snapshot)
for i in snapshot.children {
guard let childSnapshot = i as? DataSnapshot else { return }
let key = childSnapshot.key
let postRef = Database.database().reference().child("posts").child(key)
postRef.child("author").updateChildValues(["image": self.chosenAvatar, "image-color": self.chosenColor as Any])
}
}
}这个查询运行得很好,但我的问题是,当我签出当前用户并注册一个新帐户时,我会更改新用户的配置文件图像和颜色,并更新我以前登录到的其他帐户的帖子。打印语句甚至会显示当前用户的uid不是它更新的帖子中的uid。下面是具有相关节点的post的Firebase数据结构:
"posts": {
"[post_id]": {
"author": {
"image": "avatar-3",
"image-color": 3,
"uid": "[uid]",
"username": "[username]"
},如果你知道为什么会发生这种情况,或者我需要包括其他的东西,请告诉我。
发布于 2022-05-10 01:40:16
听起来,在用户登录或退出时,您没有更新user变量,这将导致user.uid引用在应用程序启动时登录的用户。
要解决这个问题,您需要实现一个auth状态侦听器,如获取当前用户文档中的第一个代码片段所示。
handle = Auth.auth().addStateDidChangeListener { auth, user in
// ...
}通过使用侦听器,每当auth状态发生变化(包括新用户登录时),就会调用回调,因此这是更新user变量的最佳时机。
https://stackoverflow.com/questions/72179527
复制相似问题