2015-11-01 43 views
1

我無法返回經度和緯度。我總是得到0.0和0.0。iOS - 我怎樣才能返回經度和緯度?

我能做些什麼來獲得這些值?

代碼:

func forwardGeocoding (address: String) -> (Double, Double) { 
let geoCoder = CLGeocoder() 

var latitude: Double = 0.0 
var longitude: Double = 0.0 

geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in 

    if error != nil { 
     print(error?.localizedDescription) 
    } else { 
     if placemarks!.count > 0 { 
      let placemark = placemarks![0] as CLPlacemark 
      let location = placemark.location 

      latitude = Double((location?.coordinate.latitude)!) 
      longitude = Double((location?.coordinate.longitude)!) 

      print("before : \(latitude, longitude)") 

     } 
    } 
} 

print("after : \(latitude, longitude)") 
return (latitude, longitude) 
} 

這是我的viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 
    forwardGeocoding("New York, NY, United States") 

} 

結果:

後:(0.0,0.0)

前:(40.713054,-74.007228)

+0

您正在通過對geocodeAddressString異步調用獲取值之前很久纔打印並返回值。 – rmaddy

回答

2

您的代碼存在的問題是地理編碼請求是異步的,因此在實際檢索地理編碼結果之前執行return語句。

我可能會使用兩個選項之一來解決這個問題。首先,而不是返回一個元組,使自己完成處理程序,並把它作爲地標被發現後:

func forwardGeocoding (address: String, completion: (CLLocationCoordinate2D) -> Void) { 
    let geoCoder = CLGeocoder() 
    geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in 

     if error != nil { 
      print(error?.localizedDescription) 
     } else { 
      if placemarks!.count > 0 { 
       let placemark = placemarks![0] as CLPlacemark 
       let location = placemark.location 
       completion(location.coordinate) 
      } 
     } 
    } 
} 

現在,當你調用這個函數,你可以在任何地方你提供完成與相關值調用該函數。

如果該函數實際上是一個類中的方法,並且它不需要從另一個類中調用,那麼可以讓它設置該類的屬性,並且這些屬性可以具有didSet塊。例如:

class SomeClass { 
    var coordinates: CLLocationCoordinate2D { 
     didSet { 
      doSomethingWithCoordinates() 
     } 
    } 

    private func forwardGeocoding (address: String, completion: (CLLocationCoordinate2D) -> Void) { 
     let geoCoder = CLGeocoder() 
     geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in 

      if error != nil { 
       print(error?.localizedDescription) 
      } else { 
       if placemarks!.count > 0 { 
        let placemark = placemarks![0] as CLPlacemark 
        let location = placemark.location 
        self.coordinates = location.coordinate 
       } 
      } 
     } 
    } 
} 

第一個選擇可能是更靈活,但其完成的塊withing完成塊,有時會變得混亂第二避免了跟蹤在你的代碼。

2

很明顯,你的函數總是返回(0.0,0.0)。這是因爲geoCoder.geocodeAddressString()異步返回地標。 這是非常耗時的操作,所以你必須修改你的代碼來處理它。

一個可能的解決方案是修改你的函數:

func forwardGeocoding (address: String, completion: (Bool, CLLocationCoordinate2D!) ->()) { 
    let geoCoder = CLGeocoder() 

    geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in 

     if error != nil { 
      print(error?.localizedDescription) 
      completion(false,nil) 
     } else { 
      if placemarks!.count > 0 { 
      let placemark = placemarks![0] as CLPlacemark 
      let location = placemark.location 

      completion(true, location?.coordinate) 

     } 
    } 
} 

,並稱之爲:

self.forwardGeocoding(YourAdress, completion { 
    success, coordinate in 

    if success { 
     let lat = coordinate.lattitude 
     let long = coordinate.longitude 
     // Do sth with your coordinates 
    } else { 

     // error sth went wrong 
    } 

} 

注意你的函數沒有返回。 希望有所幫助。

相關問題