【问题标题】:Firebase - retrieve all child keys and child values into separate arrays in SwiftFirebase - 将所有子键和子值检索到 Swift 中的单独数组中
【发布时间】:2017-12-20 22:00:58
【问题描述】:

有没有什么方法可以获取一个子节点中的所有键,将它们放入数组中,然后检索键的值并将其放入另一个数组中?

源代码:

self.ref?.child("data").child("success").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
   if snapshot != nil {
        // Your answer goes here
   }
}

【问题讨论】:

    标签: ios arrays swift firebase firebase-realtime-database


    【解决方案1】:

    如果你像我一样喜欢映射而不是迭代,你可以这样做

    let keys = snapshot.children.compactMap { ($0 as? DataSnapshot)?.key }
    let values = snapshot.children.compactMap { ($0 as? DataSnapshot)?.value }
    

    【讨论】:

      【解决方案2】:

      快照有两个属性。

      snapshot.key
      snapshot.value
      

      当使用带有 .value 的观察者时。所有 key:value 子项都在快照中返回。可以迭代它们以捕获每个键:像这样的值对。

      ref.observeSingleEvent(of: .value, with: { (snapshot) in
          for child in snapshot.children {
              let snap = child as! DataSnapshot
              let key = snap.key
              let value = snap.value
              print("key = \(key)  value = \(value!)")
          }
      })
      

      请记住,value 属性可以是字符串、数字、数组或其他字典(快照)。在原始问题中,它是一个字符串。

      【讨论】:

        【解决方案3】:

        这样的东西应该可以工作(使用更好的命名变量):

        1. snapshot.value 转换为字典
        2. 使用字典的.keys.values 属性将它们检索为LazyMapCollection 类型。
        3. 用集合初始化一个数组。

        代码:

        self.ref?
            .child("data")
            .child("success")
            .child(userID!)
            .observeSingleEvent(of: .value, with: { (snapshot) in
                if let data = snapshot.value as? [String: Any] {
                    let keys = Array(data.keys)
                    let values = Array(data.values)
                    ... // Your code here
                }
            }
        

        更新 - 显示尊重顺序的示例:

        我可能会将字典保存到一个数组中,该数组将其转换为类型Array<(key: String, value: Any)>。然后,您可以将其映射到键或值并保持顺序。

        ... // As above
            .observeSingleEvent(of: .value, with: { (snapshot) in
                if let data = snapshot.value as? [String: Any] {
                    let dataArray = Array(data)
                    let keys = dataArray.map { $0.0 }
                    let values = dataArray.map { $0.1 }
                    ... // Your code here
                }
            }
        

        【讨论】:

        • 这里的问题是顺序丢失了。
        • @Jay 更新了代码以反映您的评论 - 这是否解决了您的问题?
        • 不幸的是,如果该值是另一个快照,那将不起作用。不过,它适用于这个问题,只要 OP 将值保留为字符串或数字(即直接可排序的值)。我喜欢这个解决方案!
        • @Jay 如果您不介意,请您帮帮我,查看我与 firebase 观察者相关的帖子。我不希望每次更改都反映到观察者的特定字段时的完整列表数据。我真的沉迷其中。链接:stackoverflow.com/questions/58506034/…
        【解决方案4】:

        我想在我的项目中做类似的事情。希望这对您有所帮助,并且您明白了

        var photosList = [String]()
        refToObserve?.observeSingleEvent(of: .value, with: {snapshot in
                if let snapshotValue = snapshot.value as? [String:Any] {
                    for child in snapshot.childSnapshot(forPath: ***your path***).children {
                        let myChild = child as! DataSnapshot
                        if let myChildValue = myChild.value as? [String:Any] {
                            self.photosList.append(myChildValue["postId"] as! String)
                        }
                    }
                }
            })
        

        【讨论】:

          猜你喜欢
          • 2019-07-18
          • 2017-07-13
          • 2019-11-11
          • 1970-01-01
          • 1970-01-01
          • 2017-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多