【问题标题】:Firebase - Managing user likes in an efficient way - SwiftFirebase - 以有效的方式管理用户喜欢 - Swift
【发布时间】:2017-05-14 14:01:38
【问题描述】:

我有一个应用程序,用户可以在应用程序中点赞,出于显而易见的原因,用户不应该点赞两次。为了确保这一点,当用户喜欢某物时,我将文章的键存储在数据库的列表中。问题是当加载表格视图以检查用户是否已经喜欢这篇文章时,最有效的方法是什么。

但在那之后我需要建议,按照我的看法,我有两种方法可以做到这一点。

  1. 我可以在应用程序启动时加载整个列表,然后在加载表格视图时检查文章键是否在已经喜欢的键列表中。 (这就是我倾向于的)唯一的问题是当用户喜欢说 1000 件事时,每次应用启动时它都必须从 Firebase 下载 1000 行,这很多,另一个问题意味着文章可以'在此查询完成之前开始加载。

  2. 将文章键传递到单元格中,然后在数据库中查询该键以查看它是否存在,我担心这是因为这意味着每次加载单元格时都会有一个查询,而且很多查询和网络活动。我不确定这是否会成为问题。

提前致谢! :)

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    我建议不要防止在客户端重复“喜欢”;正如你所描述的那样,它最终会过于详尽。您可以做两件事:

    1. 您可以通过如下构造数据库来防止重复:

      {
        "likes": {
           "user1Key": {
              "objectLikedKey1": true,
              "objectLikedKey2": true
              ...
           }
         }
      }
      

    这样,数据结构默认会防止重复。把它想象成一套!

    1. 如果您的数据库结构不同,并且出于某种原因您需要这种方式,您可以使用规则来防止重复。 (我在这里假设一个随机结构,这样你就可以理解了)

      {
        "rules": {
           ".read": true,
           "userLikes": {
              "$user": {
                 ".write": "!data.exists()"
              }
           }
         }
      }
      

    这意味着只有在数据不存在时才能写入数据库。

    更新:

    在结构中为每个对象创建一个子对象,每个对象都包含“喜欢”该对象的所有用户的列表

        {
          "objects": {
             "object1Key": {
                "user1Key": true,
                "user2Key": true
                ...
                "timestamp": "2017-01-01 12:00:00 +0000"
              }
           }
        }
    

    如果您想检索某个用户喜欢的所有对象,第 (1) 点中的结构将很有用。如果要检索所有喜欢某个对象的用户,则应使用后一种结构。

    如果您有某种类似于 Facebook 的新闻源表来加载帖子或对象,那么第二种方法是最好的,它还可以防止重复喜欢。您可能还想在表中实现某种分页机制,当用户滚动查看更多内容时,它会加载合理数量(比如 5 或 10 个)对象。每次检索对象页面时,遍历喜欢该对象的用户,并检查当前登录的用户是否是其中之一,如果是,请适当设置按钮的颜色。

    如果您有很多活动,它会占用一些内存,但这是您目前最好的方法。我相信最节省内存的解决方案是在服务器而不是客户端的设备上循环遍历对象的喜欢过程,因此无论用户是否喜欢它,您都可以检索一个布尔值,但 Firebase 不提供该选项。

    实施提示:

    -如果你真的要使用上面推荐的分页机制,你可以使用下面的方法来检查你是否需要加载更多的项目:

    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
            let lastElement = yourDataSource.count - 1
            if indexPath.row == lastElement {
                // load more
            }    
    }
    

    -分页需要某种标记来设置应该检索哪些项目,因此您可能应该为添加到结构中的每个对象存储一个时间戳(以及喜欢该对象的用户列表,如上所示) .这个link有一个关于分页的详细答案。如果您熟悉queryOrderedByChild()queryStartingAtValue()queryLimitedToFirst(),您将很容易理解,可能无需通过链接中的答案!

    【讨论】:

    • 我喜欢这种方法!但是通过应用程序设计,当用户喜欢它时,喜欢按钮会变成蓝色,我怎样才能让它如果他们已经喜欢它,按钮已经是蓝色的?没有我上面提到的问题?
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 2018-06-26
    • 2018-05-27
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多