从异步完成处理程序获取数据

时间:2017-02-14 21:46:23

标签: swift asynchronous core-location

在拥有纬度和经度的同时,尝试获取城市的名称。 在模型类Location中,我使用了CLGeocoder(CoreLocation的一部分)附带的reverseGeocodeLocation(location: , completionHandler: ) func。

func getLocationName() {

    let geoCoder = CLGeocoder()
    let location = CLLocation(latitude: currentLatitude, longitude: currentLongitude)

    geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
        guard let addressDict = placemarks?[0].addressDictionary else {
            return
        }

        if let city = addressDict["City"] as? String {
            self.currentCity = city
            print(city)
        }
        if let zip = addressDict["ZIP"] as? String {
            print(zip)
        }
        if let country = addressDict["Country"] as? String {
            print(country)
        }
    })
}

但是,在ViewController中,在运行getLocationName()之后,location.currentCitynil,因为完成处理程序是异步的,并且还没有完成。

如何确保完成处理程序已完成运行,以便我可以访问location.currentCity

2 个答案:

答案 0 :(得分:3)

将一个闭包作为函数参数传递给你的getLocationName 你可以在reverseGeocodeLocation闭包内调用。

func updateLocation(currentCity : String) -> Void
{
  print(currentCity)
}

func getLocationName(callback : @escaping (String) -> Void)
{

  let geoCoder = CLGeocoder()
  let location = CLLocation(latitude: currentLatitude, longitude: currentLongitude)

  geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
     guard let addressDict = placemarks?[0].addressDictionary else {
        return
     }


     if let city = addressDict["City"] as? String
     {
         self.currentCity = city
         callback(city)

         print(city)
      }
      if let zip = addressDict["ZIP"] as? String {
         print(zip)
      }
      if let country = addressDict["Country"] as? String {
        print(country)
      }
   })
 }

在ViewController中......

getLocationName(callback: updateLocation)

答案 1 :(得分:0)

我将创建一个使用location.currentCity的函数,并从完成处理程序

中调用此函数

因此,如果您的代码如下:

func foo() {
    var location
    getLocationName()
    print(location.currentcity) // nil
}

将其更改为:

func foo() {
    var location
    getLocationName()
}

func bar() {
    print(location.currentcity) // someplace
}

并从完成处理程序中调用bar()