0

为了弄清楚如何修复这段代码,我一直在敲我的脑袋。基本上我有一段代码,它接受一个字符串 cityName 并将它的纬度和经度存储在一个全局变量中,然后在另一个函数中调用它。显然由于异步调用,我无法做到这一点,并且经度和纬度的值为零。

func findCityCoordinates(cityName: String)  {
        var geocoder = CLGeocoder()

        geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
            if let placemark = placemarks?[0] as? CLPlacemark {

              self.cityLatitude = placemark.location.coordinate.latitude //Returns nil
              self.cityLongitude = placemark.location.coordinate.longitude //Returns nil
            }
        })
    }

我也一直在尝试解决完成处理程序,但我不知道如何实现它并在函数中调用它。我会很感激一些帮助。

4

3 回答 3

1

我能够为此使用调度异步。我在地理编码器上方声明了两个变量,将它们分配在内部,并在完成后使用它们。

var lat:Float!
var long:Float!
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
    if let placemark = placemarks?[0] as? CLPlacemark {
         lat = Float(placemark.location.coordinate.latitude)
         long = Float(placemark.location.coordinate.longitude)
     }
     dispatch_async(
         dispatch_get_main_queue(), {
            self.cityLatitude = lat 
            self.cityLongitude = long 
      })
})
于 2015-08-04T00:40:04.337 回答
0

...将它的纬度和经度存储在一个全局变量中,然后在另一个函数中调用它

我怀疑在地理编码器完成块设置值之前,另一个函数正在使用它。如果可能的话,将对另一个函数的调用放到完成块中。

func findCityCoordinates(cityName: String)  {
    var geocoder = CLGeocoder()
    geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
        if let placemark = placemarks?[0] as? CLPlacemark {
            self.cityLatitude = placemark.location.coordinate.latitude //Returns nil
            self.cityLongitude = placemark.location.coordinate.longitude //Returns nil

            *** <-- call your function that uses location here --> ***
        }
    })
}
于 2015-08-04T00:57:25.880 回答
0

好吧,我的兄弟在这方面帮了我一些忙,基本上我想在保存按钮的 IBAction 中运行一个完成块,而不是在函数 findCityCoordinates 中运行:

 func findCityCoordinate(city: String, completionHandler: (coordinate: CLLocationCoordinate2D) -> ()) { 
      let geocoder = CLGeocoder() 
      geocoder.geocodeAddressString(city) { (placemarks: [AnyObject]!, error: NSError!) -> () in 
          if let placemark = placemarks[0] as? CLPlacemark { 
              let coordinate = placemark.location.coordinate 
              completionHandler(coordinate: coordinate) 
          } 
      } 
 }

这是在 saveButton 操作插座中调用的函数:

 findCityCoordinates(searchBar.text) { (cityCoordinate: CLLocationCoordinate2D) -> () in
     self.queryForTable(cityCoordinate)
     // Force reload of table data
     self.myTableView.reloadData()
 }
于 2015-08-04T05:26:44.273 回答