更有效的方法来检索Firebase数据?

use*_*869 2 hierarchical-data ios firebase swift firebase-realtime-database

我有一组分层数据,我想从Firebase检索信息.以下是我的数据的外观:在此输入图像描述

但是,我的问题是:在查看数据结构的方式时,当我想要获取name或者object ida时attendee,我必须执行以下代码:

func getAttendees(child: NSString, completion: (result: Bool, name: String?, objectID: String?) -> Void){
    var attendeesReference = self.eventsReference.childByAppendingPath((child as String) + "/attendees")

    attendeesReference.observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) -> Void in

        //Get the name/object ID of the attendee one by one--inefficient?
        let name = snapshot.value.objectForKey("name") as? String
        let objectID = snapshot.value.objectForKey("objectID") as? String
        if snapshot != nil {
            println("Name: \(name) Object ID: \(objectID)")
            completion(result: true, name: name, objectID: objectID)
        }

        }) { (error) -> Void in
            println(error.description)
    }   
}
Run Code Online (Sandbox Code Playgroud)

现在,这将通过每个与会者的孩子逐个抓取名称和对象ID.函数完成后,我将每个值存储到字典中.执行此操作时,此函数被多次调用,并且可能非常慢,尤其是在多次往返数据库时.有没有更有效的方法来做到这一点?我试图寻找到FEeventType.Value,但似乎与内返回所有attendees的孩子,当我真正想要的是nameobjectID每个attendee存储成某种字典.任何帮助,将不胜感激.谢谢!

Fra*_*len 10

Firebase的一个重要规则是只在您想要检索所有数据时才嵌套数据.此规则的原因是Firebase始终返回完整节点.您无法部分检索该节点中的某些数据,也无法检索其他数据.

关于构建数据Firebase指南说明了这一点:

因为我们可以嵌套深达32级的数据,所以很容易认为这应该是默认结构.但是,当我们在数据库中的某个位置获取数据时,我们还会检索其所有子节点.因此,在实践中,最好保持尽可能平坦,就像构建SQL表一样.

你应该真正阅读文档的整个部分,因为它包含一些非常好的例子.

在您的情况下,您需要修改数据结构以将事件参与者与事件元数据分开:

events
  -JFSDFHdsf89498432
    eventCreator: "Stephen"
    eventCreatorId: 1764137
  -JOeDFJHFDSHJ14312
    eventCreator: "puf"
    eventCreatorId: 892312
event_attendees
  -JFSDFHdsf89498432
    -JSAJKAS75478
      name: "Johnny Appleseed"
    -JSAJKAS75412
      name: "use1871869"
  -JOeDFJHFDSHJ14312
    -JaAasdhj1382
      name: "Frank van Puffelen"
    -Jo1asd138921
      name: "use1871869"
Run Code Online (Sandbox Code Playgroud)

这样,您可以检索事件元数据而无需检索与会者,反之亦然.