【问题标题】:How to store likes using Firebase如何使用 Firebase 存储喜欢
【发布时间】:2015-12-21 07:10:41
【问题描述】:

我在 firebase 上有一个后端,并且有类似 Facebook 中的帖子之类的东西。所以我需要喜欢这些帖子的功能。问题是如何存储喜欢和喜欢帖子的用户? 所有帮助将不胜感激

【问题讨论】:

  • @luk2302 我只是想知道理论上会怎样。我不需要代码
  • 同样的逻辑也适用于“理论”问题:您自己提出了哪些想法和概念?
  • @luke2302 每个帖子都有一个字段,我可以在其中存储喜欢的对象数组
  • @luke2302 我认为有更好的方法来做到这一点
  • 请将其编辑到您的问题中,以便每个人都可以轻松查看 - 我个人对 firebase 不了解,只是试图改进您的问题,以便您获得有用答案的机会更高。

标签: ios swift 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)

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2018-06-26
    • 1970-01-01
    • 2012-10-11
    • 2017-02-08
    • 2021-10-12
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多