2016-05-13 24 views
1
"-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が座標シャッフルを取得してレンダリングがうまくいかない

ありがとうございました。

+0

を使うのか? – Wain

+0

大きな問題ですか?私はこの辞書構造を作成します。 – sparky

+1

辞書には注文がないので、注文を知るためにJSONをシリアルで解析する必要があります。 – Wain

答えて

0

firebaseデータを.Valueで読み込むと、ノード内のすべてのデータがスナップショットに返されます。

特定の順序でデータが必要な場合は、順序付けしたいものを決定する必要があります。ナチュラルオーダーはキーで行いますが、他のパラメータでオーダーしたい場合は、それを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の)あなたのJSONは配列が含まれていない理由を

関連する問題