2017-05-31 12 views
0

私は逆方向コード関数に基づいてアドレスの配列を作成しようとしていますが、その機能については後述します。しかし、私が緯度と経度を値の配列から入力し、それを私のアドレス時代に追加するたびに、時代の秩序は常に乱雑になります。ここに私のコードは次のとおりです。配列の値の配列が異なっています

func getAddressFromLatLon(pdblLatitude: Double, withLongitude pdblLongitude: Double){ 
    var center : CLLocationCoordinate2D = CLLocationCoordinate2D() 
    let lat: Double = pdblLatitude 
    //21.228124 
    let lon: Double = pdblLongitude 
    //72.833770 
    let ceo: CLGeocoder = CLGeocoder() 
    center.latitude = lat 
    center.longitude = lon 

    let loc: CLLocation = CLLocation(latitude:center.latitude, longitude: center.longitude) 


    ceo.reverseGeocodeLocation(loc, completionHandler: 
     {(placemarks, error) in 
      if (error != nil) 
      { 
       print("reverse geodcode fail: \(error!.localizedDescription)") 
      } 
      let pm = placemarks! as [CLPlacemark] 

      if pm.count > 0 { 
       let pm = placemarks![0] 
       print(pm.country) 
       print(pm.locality) 
       print(pm.subLocality) 
       print(pm.thoroughfare) 
       print(pm.postalCode) 
       print(pm.subThoroughfare) 

       if pm.subThoroughfare != nil { 
        addressString = addressString + pm.subThoroughfare! + " " 
       } 
       if pm.thoroughfare != nil { 
        addressString = addressString + pm.thoroughfare! + ", " 
       } 
       if pm.locality != nil { 
        addressString = addressString + pm.locality! + ", " 
       } 
       if pm.administrativeArea != nil { 
        addressString = addressString + pm.administrativeArea! + " " 
       } 
       if pm.postalCode != nil { 
        addressString = addressString + pm.postalCode! + " " 
       } 
       print (addressString) 
       addressStrings.append(addressString) 
       addressString = "" 
      } 
    }) 
} 

func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) { 
    print(#function) 
} 


@IBAction func onSearh(_ sender: Any) { 
    for i in 0 ..< ((stores!.count)-1) { 
     print (latitudes[i]) 
     print (longitudes[i]) 
     getAddressFromLatLon(pdblLatitude: latitudes[i], withLongitude: longitudes[i]) 
    } 

あなたは自分のプロジェクトでこれを入力するか、または機能が私に同じ入力に対して異なる出力を与えることによって、決定論的である理由を把握することができます場合、私は不思議でしたか?

+0

あなたの問題が何か分かりません。あなたの 'getAddressFromLatLon'関数をテストしたところ、うまくいくようです。 –

答えて

0

逆ジオコーディングは非同期関数です。ネットワーク要求であり、関数呼び出しが呼び出されたときと同じ順序で返されない可能性があるためです。

呼び出されたのと同じ順序で必要な場合は、getAddressFromLatLon関数をシリアルキューで実行できます。これにより、結果の順序が保証されますが、この場合はネットワーク要求が同時に実行されないため、パフォーマンス上の欠点があります。

私の場合は、データ構造を構造体に変更します。この構造体から、インデックス以外の識別子を持つ要素にアクセスできます(たとえば、識別子をキーとし、値をアドレスとする辞書)。この場合、逆ジオコーディング機能を同時に実行することができます。

関連する問題