如何以相同的顺序检索坐标?

时间:2016-05-13 11:22:07

标签: swift firebase mapkit

"-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,然后渲染效果不佳。

感谢您提供一些建议。

1 个答案:

答案 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)