【问题标题】:Why does Swift not update the variables outside the closure?为什么 Swift 不更新闭包外的变量?
【发布时间】:2014-10-16 01:12:59
【问题描述】:

这是我正在使用的代码——问题是返回的 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
}

【问题讨论】:

    标签: swift core-location


    【解决方案1】:

    作为@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 组件。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多