【问题标题】:Swift - Sort and array with [String: Int]Swift - 使用 [String: Int] 进行排序和数组
【发布时间】:2018-02-08 16:32:37
【问题描述】:

我是 Swift 语言的新手,我正在尝试编写一个函数,该函数允许在我的 Firebase 数据库中获取 6 个最受欢迎的人。

我写了一个观察者,它把用户放在这样的数组中:

[[userID: numberOfFollowers], [userID: numberOfFollowers], ...]

我想只保留关注人数最多的 6 个用户。

你知道这是否可能吗?

var people = [[String: Int]]()

func loadPeople() {
  var REF_FOLLOWERS = Database.database().reference().child("followers")

  REF_FOLLOWERS.observe(.value, with: { (snapshot: DataSnapshot!) in
     print("Got snapshot")
     if let dict = snapshot.value as? [String: Any] {
        for (key, value) in dict {
           var count = 1
           if let array = value as? [String: Any] {
              for _ in array {
                 count += 1
              }
           }

           self.people.append([key : count])
           self.tableView.reloadData()
        }
     }
  })
}

【问题讨论】:

  • 这是一个数据库。为什么在获取时不对项目进行排序?

标签: arrays swift firebase firebase-realtime-database


【解决方案1】:

你可以使用类似的东西:

var REF_FOLLOWERS = Database.database().reference().child("followers").queryOrdered(byChild: "numberOfFollowers").queryLimited(toFirst: 6).observe(.value, with: { (snapshot: DataSnapshot!) in {
}

这将给出关注人数最多的前 6 名。

【讨论】:

  • 这似乎是最好的解决方案。为什么要向数据库询问所有关注者,然后在每次更改时对其进行排序。数据库内置了查询排序和限制,为什么不使用它呢? (已投票)
  • 您唯一需要更改的是只获取最后 6 个,因为在 Firebase 中排序总是升序:queryLimited(toLast: 6)。顺便说一句,这也意味着您必须反转客户端上的项目,通常通过将每个后续项目添加到视图的开头(而不是添加到末尾)。
  • 我的问题是我的数据库中没有值“numberOfFollowers”。我应该创建一个新的孩子以便为每个用户增加一个计数器吗?
【解决方案2】:
REF_FOLLOWERS.observe(.value, with: { (snapshot: DataSnapshot!) in
   print("Got snapshot")
   if let dict = snapshot.value as? [String: Any] {
      for (key, value) in dict {
         var count = 1
         if let array = value as? [String: Any] {
            for _ in array {
               count += 1
            }
         }

         self.people.append([key : count])
      }
   }
   // this line will sort them and return first 6
   self.people = self.people.sorted(by: { $0["numberOfFollowers"] ?? 0 > $1["numberOfFollowers"] ?? 0}).prefix(6)
   // reload data just once at the end - be efficient!
   self.tableView.reloadData()
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多