为什么Swift不更新闭包之外的变量?

时间:2014-10-16 01:13:00

标签: swift core-location

这里是我使用的代码 - 问题是返回的CLLocationCoordinate2D对象中的纬度和经度值都是-1,即它们的初始化值。我错过了什么?

func getLocationInfoForAddress(shop: store) -> CLLocationCoordinate2D {

    var address = getAddressInOneLine(shop)
    var latitude: CLLocationDegrees = -1
    var longitude: CLLocationDegrees = -1

    var geocoder = CLGeocoder()
    geocoder.geocodeAddressString(address, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
        if let placemark = placemarks?[0] as? CLPlacemark {
            latitude = placemark.location.coordinate.latitude
            longitude = placemark.location.coordinate.longitude
        }
    })

    var location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude,longitude: longitude)
    return location
}

2 个答案:

答案 0 :(得分:2)

geocodeAddressString(:completionHandler:)方法是异步的:

  

此方法异步将指定的位置数据提交给地理编码服务器并返回。您的完成处理程序块将在主线程上执行。在发起前向地理编码请求后,请勿尝试启动另一个正向或反向地理编码请求。

因此,在您创建location并从函数返回后执行它。您需要重构代码以异步处理它。

答案 1 :(得分:2)

作为@NateCook答案的补充,重构代码的一种可能方法是:

func getLocationInfoForAddress(shop: store) {
    var address = getAddressInOneLine(shop)

    var geocoder = CLGeocoder()
    geocoder.geocodeAddressString(address, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
        if let placemark = placemarks?[0] as? CLPlacemark {
            var latitude = placemark.location.coordinate.latitude
            var longitude = placemark.location.coordinate.longitude

            var location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude,longitude: longitude)
            self.didReceiveGeocodeAddress(location)
        }
    })
}

func didReceiveGeocodeAddress(location: CLLocationCoordinate2D) {
    // do something
}

获取位置后,您将调用传递该位置的同一类的方法。由于处理程序闭包是在主线程中执行的,因此您可以安全地更新UI组件。