当前位置: 首页 > 面试题库 >

遍历Firebase中的快照子级

濮翰学
2023-03-14
问题内容

我有一个Firebase资源,其中包含几个对象,我想使用Swift对其进行迭代。我期望的工作如下(根据Firebase文档)
https://www.firebase.com/docs/ios-
api/Classes/FDataSnapshot.html#//api/name/children

var ref = Firebase(url:MY_FIREBASE_URL)
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
  println(snapshot.childrenCount) // I got the expected number of items
    for rest in snapshot.children { //ERROR: "NSEnumerator" does not have a member named "Generator"
       println(rest.value)     
     }
 })

因此,看来Swift遍历Firebase返回的NSEnumerator对象存在问题。

非常欢迎您提供帮助。


问题答案:

如果我没看错文档,这就是您想要的:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
       print(rest.value)     
    }
}

更好的方法可能是:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    let enumerator = snapshot.children
    while let rest = enumerator.nextObject() as? FIRDataSnapshot {
       print(rest.value)     
    }
}

第一种方法需要NSEnumerator返回所有对象的数组,然后可以按通常方式枚举该对象。第二种方法是一次从获取一个对象,这NSEnumerator可能更有效。

无论哪种情况,要枚举的FIRDataSnapshot对象都是对象,因此您需要进行强制转换,以便可以访问该value属性。

使用for-in循环:

自从Swift 1.2天后写出原始答案以来,该语言就得到了发展。现在可以使用for in直接与枚举器一起使用的循环以及case let分配类型:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    for case let rest as FIRDataSnapshot in snapshot.children {
       print(rest.value)     
    }
}


 类似资料:
  • 我要做的是遍历Firebase数据库,看看是否有某个值,如果有,则什么也不做,如果没有,则向节点添加另一个值。 我的Firebase收藏是这样的: 同样,我不确定这是不是正确的代码,但它是类似的。我用这个答案作为帮助,但不能根据我的需要调整它:Firebase/Android如何获得子键和值? 还有一个问题,我得到的是,我的数据库是无限填一遍又一遍。

  • 问题内容: 我需要遍历Firebase架构以获取每个的数据并在RecyclerView中显示它。现在,我无法使用侦听器遍历Firebase中的Schema,也无法通过名为的POJO类来获取它。 Firebase的JSON 侦听器代码 LOGCAT 03-28 08:52:53.966 23584-23584 / com.android.sam I / System.out:{-KDni3TN4NM

  • 问题内容: 我有一个带有多个子SKSpriteNode的SKNode。一个简化的例子: 我想对所有这些孩子采取行动。当我在上执行操作时,没有任何效果。 我不能在父项上使用,因为它的许多子项已经具有我正在使用的名称。 有没有一种方法可以遍历的所有子项,以便对所有子项执行单个操作? 问题答案: 您可以简单地列举: 如有必要,请检查每个孩子是否确实是: 从 Swift 2(Xcode 7)开始, 可以将

  • 问题内容: 我需要有关从此DataSnapshot结果中获取“消息”对象的帮助 我可以通过获取键值,并且也可以作为对象,这是FireBase自动生成的对象名称。而不是听对象本身。如何使用DataSnapshot成员方法浏览低谷,“发送者”或“消息”并获取其值? 问题答案: 我似乎在为具有多个子项的对象添加值侦听器。我猜这是一个查询,但是如果您在问题中包含代码,那将非常有帮助。但是,在您添加它之前,

  • 问题内容: 这是我的代码: 这是我此页面的XML: 问题是我只能在LogCat控制台上得到它: 为什么我没有得到对TextViews的引用? 问题答案: 您需要递归遍历视图树。当前,您仅列出根视图的子级。 换句话说,您需要这样的东西:

  • 我有一个函数,当单击搜索表单上的按钮时,它会被调用。我们得到字符串并检查它以确保它只是字母。然后我们检查球员的名字是否已经在数据库中,如果不是,我们添加他。如果他在数据库中,我们转到语句的else部分。这工作得很好--但是在我的其他区域,当我们确定数据库中有一个名字完全相同的玩家时,我想要为该玩家操作数据库中的一个特征。具体地说,在玩家投票计数中加上1。 我的火力点是这样布置的: