我有这个方法:
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#>)
我该怎么做?
答案 0 :(得分:0)
您不能使用异步函数中的值,就像它是正常的同步返回值一样。
您必须访问闭包内的值以确保异步方法已经完成执行。如果您试图在闭包之外访问该值,则无法以任何方式确保该值已经设置,因为异步方法在它们实际完成执行之前返回,但您可以使用闭包来确保这一点。
除了完成处理程序之外,还有一些方法(例如DispatchQueue
或使用第三方框架,如PromiseKit)来解决此问题,但是您永远无法使用来自异步方法的值的方式相同,没有任何限制,就像使用同步方法中的值一样。
这是如何访问完成处理程序返回的值:
self.getCoordinate(addressString: "Summerville, SC", completionHandler: { coordinate, error in
guard error == nil else {return}
//use the coordinate here
})
对当前方法稍作改进:如果地理编码不成功,我会返回nil
作为坐标,而不是返回无效坐标。