如何使用 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 存储中获取文件列表

如何使用 Firebase 云存储添加图像存储功能?

如何在不使用 Firebase 身份验证的情况下保护 Firebase 存储? (下一个)

如何使用颤振删除 Firebase 存储文件?

如何使用生产存储桶数据启动 Firebase 存储模拟器?