2017-07-16 28 views

回答

9

快照有两个属性。

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 
     } 
    } 
+0

这里的问题是,排序丢失。 – Jay

+0

@Jay更新了代码以反映您的评论 - 这是否解决了您的问题? – Yasir

+0

不幸的是,如果该值是另一个快照,则不起作用。只要OP保持该值为一个字符串或数字(即可直接订购的值),它*将*用于该问题。我喜欢解决方案! – Jay

1

我想在我的项目中做类似的事情。希望这有助于你的想法

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) 
       } 
      } 
     } 
    }) 
相关问题