【问题标题】:Get list of users who liked a post Swift and Firestore获取喜欢帖子 Swift 和 Firestore 的用户列表
【发布时间】:2020-03-14 21:58:49
【问题描述】:

我正在尝试构建一个表格视图来显示喜欢当前用户帖子的用户。例如,“John Smith、Tom Jones 和 Sally Hughes 喜欢你的帖子(在单元格中显示帖子的图像”。我认为我的方法是正确的,但我想知道我的数据结构是否会使这变得不必要地困难或者如果有更简单的方法。

我的 Firestore 数据结构就在下面。 “BmV...”是userId,“-M0e...”是postId,“Ff0...”和“nIh...”是喜欢的users post

  "likeActivity" : {
    "BmvRlWWuGRWApqFvtT8mXQlDWzz2" : {
      "-M0efUXcZy43fDVXjTvT" : {
        "Ff0CxZhQzYVHuqbnsiOKwRAB01D2" : true,
        "nIhx1SnChjapy4cbrD5sC1WIZXM2" : true
      }
    },
  }

我的第一个问题是,这是否是构建这些数据的最佳方式?然后,在ActivityViewController 中使用下面的代码来检索当前用户的带有活动的帖子。

var activityDict = [String: [Any]]()
let newActivity = DataService.ds.REF_LIKE_ACTIVITY.child("\(uid)")

    //print("NEW POST - \(newPost)")

    newActivity.observe(.value, with: { (snapshot) in
               self.posts = []
               if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                   for snap in snapshot {
                    print("ACTIVITY -- \(snap.key)")
                    let userLikeData = DataService.ds.REF_LIKE_ACTIVITY.child("\(uid)").child(snap.key)
                    userLikeData.observe(.value, with: { (snapshot) in
                        self.posts.append(snap.key)
                        print("SNAPSHOT VALUE -- \(snapshot)")
                        if self.activityDict["\(snap.key)"] != nil {
                            self.activityDict["\(snap.key)"]!.append(snapshot.value!)
                        } else {
                            self.activityDict["\(snap.key)"] = [snapshot.value!]
                        }

                        self.activityTableView.reloadData()
                    })

                   }
               }

           })

我的下一个问题是,是否应该像我一样将活动累积在字典数组中?有没有更好的方法来组织这些数据?

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    我的第一个问题是,这是否是构建这些数据的最佳方式?

    使用 NoSQL 数据库时,没有单一的“最佳”方式来存储数据。相反,您将以最能支持您的用例的方式存储数据。而且由于您通常会在实施和发展应用程序时发现更多(有关您的详细信息)用例,因此您的数据模型会随之发展(适应和扩展)。

    我建议阅读NoSQL data modeling,并观看Firebase for SQL developersGetting to know Cloud Firestore。最后一个适用于 Cloud Firestore,但 Todd 讨论的许多技术同样适用于其他 NoSQL 数据库。

    是否应该像我拥有的​​那样将 [活动] 累积在字典数组中?"

    如果这适用于您的用例,那么听起来不错。

    唯一需要注意的是,您使用的是observe,它附加了一个永久侦听器,然后将更新的快照数据附加到数组中。这意味着如果数据库中的活动发生更改,您的闭包将再次调用该活动的快照。

    这很棒,因为它允许您在 UI 中显示 更新的 活动。但是由于您将其附加到数组中,因此您最终会显示该活动两次:一次是在您第一次加载它时存储在数据库中,另一次是在更新后它存在时。如果这是您的目标,那么 ?,但更常见的是 更新 数组中的现有数据,而不是将更新后的数据添加为新项目。

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2018-03-26
      • 1970-01-01
      • 2020-11-23
      • 2011-08-06
      相关资源
      最近更新 更多