如何使用 Firebase 存储喜欢
Posted
技术标签:
【中文标题】如何使用 Firebase 存储喜欢【英文标题】:How to store likes using Firebase 【发布时间】:2015-12-21 07:10:41 【问题描述】:我在 firebase 上有一个后端,并且有类似 Facebook 中的帖子之类的东西。所以我需要喜欢这些帖子的功能。问题是如何存储喜欢和喜欢帖子的用户? 所有帮助将不胜感激
【问题讨论】:
@luk2302 我只是想知道理论上会怎样。我不需要代码 同样的逻辑也适用于“理论”问题:您自己提出了哪些想法和概念? @luke2302 每个帖子都有一个字段,我可以在其中存储喜欢的对象数组 @luke2302 我认为有更好的方法来做到这一点 请将其编辑到您的问题中,以便每个人都可以轻松查看 - 我个人对 firebase 不了解,只是试图改进您的问题,以便您获得有用答案的机会更高。 【参考方案1】:采用这个数据结构:
"posts":
"post_1":
"uid": "user_1",
"title": "Cool Post"
,
"post_2":
"uid": "user_1",
"title": "Another Cool Post"
,
"post_3":
"uid": "user_2",
"title": "My Cool Post"
,
"postLikes":
"user_1":
"post_3": true
,
"user_2":
"post_1": true,
"post_2": true
位置/posts
检索所有帖子。
位置/postLikes
检索帖子上的所有赞。
假设你是user_1
。要获得 user_1
喜欢的帖子,您可以编写这个 Firebase 数据库监听器:
let ref = Firebase(url: "<my-firebase-app>")
let uid = "user_1"
let userRef = ref.childByAppendingPath(uid)
userRef.observeEventType(.Value) (snap: FDataSnapshot!) in
print(snap.value) // prints all of the likes
// loop through each like
for child in snap.children
let childSnap = child as! FDataSnapshot
print(childSnap.value) // print a single like
这里需要注意的是数据结构的“平坦度”。postLikes
不会存储在每个post
下。这意味着您可以检索post
而无需获得所有喜欢。但是,如果您想同时获得两者,您仍然可以这样做,因为您知道用户的 id。
Try giving the Firebase guide on Structuring Data a read through
【讨论】:
谢谢你,大卫。还有一个问题,如何获取帖子的点赞数? 通过快照,您可以访问snap.childrenCount
。但是,这只是对所有下载数据的计数。没有办法只返回计数。
不确定,这对我来说真的很难:)。在您的回答中,我可以存储喜欢,但无法计算帖子被点赞的次数。或者我没听懂
您还可以在每个帖子中保留一个“likeCount”。当客户“喜欢”帖子时,您可以在客户端增加该值并将其推回帖子。不过请确保处理竞争条件。
@DavidEast 你好,大卫。如果我使用你的扇出技术。我是否应该在每个帖子中存储喜欢计数,并在服务器端的每个帖子中存储每个喜欢更新的点赞计数?还是将其存储为另一个节点更好?并为每个帖子从该节点获取喜欢计数?【参考方案2】:
要添加到上面大卫回答中的 cmets(我还不能添加评论)以获取喜欢的计数,您想使用事务数据。
在你的firebase中,你想设置一个“喜欢”的孩子,在帖子节点中看起来像这样:
"posts":
"post_1":
"uid": "user_1",
"title": "Cool Post"
"likes": 0
,
"post_2":
"uid": "user_1",
"title": "Another Cool Post"
"likes": 0
,
"post_3":
"uid": "user_2",
"title": "My Cool Post"
"likes": 0
Xcode 中的代码如下所示。每次喜欢帖子时,您都会添加一个计数器(相同的代码,但使用“- 1”来表示不同)。
self.databaseRef.child("posts").child("post_1").child("likes").runTransactionBlock(
(currentData:FIRMutableData!) in
var value = currentData.value as? Int
//check to see if the likes node exists, if not give value of 0.
if (value == nil)
value = 0
currentData.value = value! + 1
return FIRTransactionResult.successWithValue(currentData)
)
希望这对某人有所帮助!
此类计数器的补充阅读:
Upvote/Downvote system within Swift via Firebase
Follower counter not updating node in firebase
【讨论】:
您给定的代码允许用户对事物多点赞 :) 是的——反对/不喜欢运行类似的代码,但 currentData.value = value! - 1【参考方案3】:我认为存储喜欢的最佳方式是创建一个数组变量...然后推送他们的 uid... 如果他们不只是拉出他们的uid ...数组的大小将是喜欢的数量。这样你就没有重复了。
"post_1":
"uid": "user_1",
"title": "Cool Post"
"likes": []
post_1.likes.push(user.uid)
【讨论】:
以上是关于如何使用 Firebase 存储喜欢的主要内容,如果未能解决你的问题,请参考以下文章
如何让用户从 web 应用程序上的 firebase 存储下载图像?
如何使用 AngularFire 从 FireBase 存储中获取文件列表