swift - Firebase - 以有效的方式管理用户喜欢 - Swift

标签 swift firebase firebase-realtime-database

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

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

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

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

提前致谢! :)

最佳答案

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

  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)的对象。每次检索对象页面时,遍历喜欢该对象的用户并检查当前登录的用户是否是其中之一,如果是,则适本地设置按钮的颜色。

如果您有很多事件,它会占用一些内存,但这是目前最好的方法。我相信最有效的内存解决方案是在服务器而不是客户端设备上循环遍历对象的喜欢过程,这样您就可以检索一个 bool 值,无论用户是否喜欢它,但 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(),您会很容易理解这个想法,也许不需要浏览链接中的答案!

关于swift - Firebase - 以有效的方式管理用户喜欢 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41393351/

相关文章:

ios - 为什么我的 firebase 数据库不等待更新值

javascript - 如何在没有node.js的情况下使用firebase实时数据库

ios - 使用 Firebase 和 Swift 3 结构化数据以比较值

ios - 带有 FCM token 的设备的 Firebase 通知显示已发送但未收到

java - 从 Java 中的 Firebase 实时数据库中选择随机条目

firebase - 从 Firestore 加载繁重的文档是否需要很长时间?

ios - 带有 AVAudioPlayer 的 iOS 中的 Swift : Singleton not working the way I hoped it would

swift - NSURLConnection 导致应用程序崩溃

ios - 使用 session 快速发出 HTTP POST 请求

IOS- 与 Firebase 的通用链接和使用 location.href 的错误?