"-KHbCuQflKHrJiUmfpG0" : {
"coordinates" : {
"-KHbCuQflKHrJiUmfpG1" : {
"latitude" : 13.17078652595298,
"longitude" : -59.5775944578738
},
"-KHbCuQflKHrJiUmfpG2" : {
"latitude" : 13.15541190861343,
"longitude" : -59.57619643155932
},
"-KHbCuQg9W_tebl1pU66" : {
"latitude" : 13.148444967591,
"longitude" : -59.5589266947333
}
},
"subtitle" : "patrick",
"title" : "River",
"type" : "polyline"
},
这是我保存折线的JSON结构,我需要以相同的顺序检索坐标。
这是我获取坐标和创建折线的代码。
// geoobject.key - is ID of geoobject (for loop geoobjects) "-KHbCuQflKHrJiUmfpG0"
DataService.dataService.getGeoObject(geoobject.key).observeEventType(.Value, withBlock: { geoSnapshot in
var coordinatesPolyline = [CLLocationCoordinate2D]()
if let geoDictionary = geoSnapshot.value as? Dictionary<String, AnyObject> {
let id = geoSnapshot.key
if geoDictionary["type"] as! String == "polyline" {
if let coords = geoDictionary["coordinates"] as? [String:[String:Double]] {
let contents = coords.values
for content in contents {
let latitude = content["latitude"]
let longitude = content["longitude"]
let point = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!)
coordinatesPolyline.append(point)
}
// coordintesPolyline contains shuffle coordinates
let polyline = Polyline(coordinates: &coordinatesPolyline, count: coordinatesPolyline.count)
//coordinates = []
polyline.id = geoSnapshot.key
polyline.title = geoDictionary["title"] as? String
polyline.subtitle = geoDictionary["subtitle"] as? String
self.polylines.insert(polyline, atIndex: 0)
}
}
})
我渲染折线,但折线是渲染器坏的,因为坐标是随机的。
有谁知道如何以正确的顺序获取坐标。 Firebase检索坐标shuffle,然后渲染效果不佳。
感谢您提供一些建议。
答案 0 :(得分:0)
当通过.Value读取firebase数据时,节点中的所有数据都将在快照中返回。
如果您希望按特定顺序排列数据,则需要确定所需的“事物”。自然顺序是按键,但是如果你想要按其他参数排序,你需要在firebase结构中包含它,然后将orderedBy添加到你的观察中。
您拥有.Value数据后,您需要迭代快照中的每个子项以访问该节点数据。例如
如果你的Firbase结构是
"coordinates" : {
"-KHbCuQflKHrJiUmfpG1" : {
"latitude" : 13.17078652595298,
"longitude" : -59.5775944578738
},
"-KHbCuQflKHrJiUmfpG2" : {
"latitude" : 13.15541190861343,
"longitude" : -59.57619643155932
},
"-KHbCuQg9W_tebl1pU66" : {
"latitude" : 13.148444967591,
"longitude" : -59.5589266947333
}
然后快照包含所有数据。迭代快照并与每个孩子一起工作:
ref.observeEventType(.Value, withBlock: { geoSnapshot in
for child in geoSnapshot.children {
let lat = child["latitude"] as? String
let long = child["longitude"] as? String
print("lat = \(lat) long = \(long)"
}
})
(没有测试那段代码,但它已经关闭了)
哦,还有一件事。 ObserveEventOfType(.Value)将持续观察节点的变化 - 添加,更改或删除,并在任何一个事件发生时触发。
如果您只想要一次性使用,请使用ObserveSingleEventOfType(.Value)