如何使用方法中的闭包获取返回的数据?

时间:2017-09-21 12:20:51

标签: swift

我有这个方法:

CumulativeSum

使用它像:

internal func getCoordinate( addressString : String,
                             completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) {

       let geocoder = CLGeocoder()
        geocoder.geocodeAddressString(addressString) { (placemarks, error) in
            if error == nil {
                if let placemark = placemarks?[0] {
                    let location = placemark.location!

                completionHandler(location.coordinate, nil)
                return
            }
        }

        completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?)
    }
}

但我想做这样的事情:

self.getCoordinate(addressString: "Summerville, SC", completionHandler: <#T##(CLLocationCoordinate2D, NSError?) -> Void#>)

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您不能使用异步函数中的值,就像它是正常的同步返回值一样。

您必须访问闭包内的值以确保异步方法已经完成执行。如果您试图在闭包之外访问该值,则无法以任何方式确保该值已经设置,因为异步方法在它们实际完成执行之前返回,但您可以使用闭包来确保这一点。

除了完成处理程序之外,还有一些方法(例如DispatchQueue或使用第三方框架,如PromiseKit)来解决此问题,但是您永远无法使用来自异步方法的值的方式相同,没有任何限制,就像使用同步方法中的值一样。

这是如何访问完成处理程序返回的值:

self.getCoordinate(addressString: "Summerville, SC", completionHandler: { coordinate, error in
    guard error == nil else {return}
    //use the coordinate here
})

对当前方法稍作改进:如果地理编码不成功,我会返回nil作为坐标,而不是返回无效坐标。