从Firebase快照阵列中获取数据

时间:2016-09-17 18:00:41

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

我有一系列Firebase快照var guardians: Array<FIRDataSnapshot> = []。我想使用这样的循环访问每个快照的子值:

 print(self.guardians)
 for snapshot in self.guardians{
     let guardianID = (snapshot.value as? NSDictionary)?["guardian"] as? NSString

但我对guardianID一直保持不变。如何从此数组中获取特定的子值?作为参考,以下是self.guardians打印到控制台的内容:

[Snap (guardians) {
    "-KQaU9lVcUYzIo52LgmN" =     {
        dependent = sJUCytVIWmX7CgmrypqNai8vGBg2;
        guardian = jY2MtbIw4rQmgcZwTbLXNrL7tDq2;
    };
}]

我正在使用Swift 3和Xcode 8。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定在不知道数组是如何构建的情况下是否可以回答这个问题。一个问题是For-in循环变量是一个NSFastEnumerationIterator,因此它需要向下转换为什么样的东西&#39;你想要它。你可能已经这样做了,这只是为了将来参考。

话虽这么说,我制作了一些代码并将其分解了一些 - 也许它会指向正确的方向。

下面的代码通过.value读入所有节点,然后遍历快照并将每个子节点存储在数组中作为FDataSnapshot。然后代码迭代该数组并打印出监护人&#39;来自存储在数组中的每个快照。

我还包含了你的代码来打印guardianID,它也有效,所以我的猜测是问题在于最初如何填充数组或在这行中

  

用于self.guardians中的快照

因为快照是NSFastEnumerationIterator

let ref = self.myRootRef.child(byAppendingPath: "guardian_node")!

ref.observe(.value, with: { snapshot in

     if ( snapshot!.value is NSNull ) {
          print("not found")
     } else {

          var guardianArray = [FDataSnapshot]()

          for child in snapshot!.children {
               let snap = child as! FDataSnapshot //downcast
               guardianArray.append(snap)
          }

          for child in guardianArray {
               let dict = child.value as! NSDictionary
               let thisGuardian = dict["guardian"]!
               print(thisGuardian)

               //your code
               let guardianID = (child.value as? NSDictionary)?["guardian"] as? NSString
               print(guardianID!)
          }
     }
})

*这是Swift 3和Firebase 2.x,但概念是一样的。