首页 > 解决方案 > 无法将数据从地理编码器保存到全局变量

问题描述

我有奇怪的问题。我试图从字符串中对地址进行地理编码,它可以工作,但我只能在地理编码器函数中获取数据。我的代码:

    private func getLocationFromAddress(address: String) -> CLLocationCoordinate2D{
    let geocoder = CLGeocoder()
    var lat = CLLocationDegrees()
    var long = CLLocationDegrees()
    geocoder.geocodeAddressString(address) { placemark, error in
        if let placemark = placemark{
            if let lattitude = placemark.first?.location?.coordinate.latitude, let longitude = placemark.first?.location?.coordinate.longitude{
                lat = lattitude
                long = longitude
                print(lat)
            }
        }else if let err = error{
            print(err.localizedDescription)
        }
    }
    print(lat)
    return CLLocationCoordinate2D(latitude: lat, longitude: long)
}

在这段代码中,当我在地理编码器内部打印变量 lat 时它可以工作,但是当我尝试在外部打印它时它是 0.0。为什么它不起作用?第二个打印件也较早地出现在控制台中。

标签: swiftcllocationcllocationcoordinate2d

解决方案


函数同步运行,whilegeocodeAddressString(_:)是异步的。改为使用闭包作为完成处理程序。

private func getLocationFromAddress(address: String, completionHandler: @escaping (CLLocationCoordinate2D?) -> Void) {
    let geocoder = CLGeocoder()
    geocoder.geocodeAddressString(address) { placemark, error in
        if let placemark = placemark {
            if let lattitude = placemark.first?.location?.coordinate.latitude, let longitude = placemark.first?.location?.coordinate.longitude {
                let coordinate = CLLocationCoordinate2D(latitude: lattitude, longitude: longitude)
                completionHandler(coordinate)
            }
        } else if let err = error{
            print(err.localizedDescription)
            completionHandler(nil)
        }
    }
}

getLocationFromAddress(address: someAddress) { coordinate in
    if let coordinate = coordinate {
        print(coordinate.latitude)
        self.coordinate = coordinate
    }
}

推荐阅读