我有一组层次结构的数据,我想从Firebase检索信息。以下是我的数据的外观:
但是,我的问题是这样的:在查看数据的结构时,当我想抓取name或object id时attendee,必须执行以下代码:
name
object id
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) } }
现在,这遍历了每个参加者的孩子,并逐个获取名称和对象ID。函数完成后,我将每个值存储到字典中。这样做后,该函数将被多次调用,并且可能会非常慢,尤其是在多次访问数据库或从数据库访问数据库时。有没有更有效的方法可以做到这一点?我试图寻找到FEeventType.Value,但似乎与内返回所有attendees的孩子,当我真正想要的是name和objectID每个attendee存储成某种字典。任何帮助,将不胜感激。谢谢!
FEeventType.Value
attendees
objectID
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"
这样,您可以检索事件元数据,而无需检索参与者,反之亦然。