这是一个相当常见的话题,我已经完成了我的研究,但仍然只是试图了解关闭/完成处理程序。
我有一个进入位置的场景。用户点击提交,并且从提交到下一个场景有一个segue。我认识到地理编码是异步的,但我希望在进入下一个场景之前出现错误时完成地理编码。
本网站上有几篇短文,但没有实质内容。
以下是我对完成处理程序失败的尝试。如果出现错误,我会收到警报但是在警报弹出之前它会首先进入下一个场景。
func geocodeAddress (completion: @escaping () -> ()) {
let geoCoder = CLGeocoder()
var coords: CLLocationCoordinate2D?
address = locationData(addressString)
geoCoder.geocodeAddressString((address)!, completionHandler: {(placemarks: [CLPlacemark]?, error: Error?) -> Void in
if error != nil {
self.alertGeocodeError()
}
if let placemark = placemarks?[0]{
// Convert the address to a coordinate
let location = placemark.location
coords = location!.coordinate
completion()
self.performSegue(withIdentifier: "locationToConfirmSegue", sender: coords)
}
})
}
override func prepare (for segue: UIStoryboardSegue, sender: Any?){
geocodeAddress{
if let destinationVC = segue.destination as? ConfirmController {
destinationVC.coords = sender as! CLLocationCoordinate2D
}
}
}
我也不太了解@esaping,任何建议都会很棒。
感谢。
答案 0 :(得分:1)
prepare(for segue:)
,系统会自动调用 self.performSegue
,因此您不应在geocodeAddress
内拨打prepare(for segue:)
。
如果您只需要从地理编码器的完成处理程序中进行切换,则不需要从geocodeAddress
函数返回闭包,您只需直接从performSegue
调用completionHandlers
即可
func geocodeAddress() {
let geoCoder = CLGeocoder()
var coords: CLLocationCoordinate2D?
address = locationData(addressString)
geoCoder.geocodeAddressString((address)!, completionHandler: {(placemarks: [CLPlacemark]?, error: Error?) -> Void in
if error != nil {
self.alertGeocodeError()
}
if let placemark = placemarks?[0]{
// Convert the address to a coordinate
let location = placemark.location
coords = location!.coordinate
self.performSegue(withIdentifier: "locationToConfirmSegue", sender: coords)
}
})
}
override func prepare (for segue: UIStoryboardSegue, sender: Any?){
if let destinationVC = segue.destination as? ConfirmController {
destinationVC.coords = sender as! CLLocationCoordinate2D
}
}
可用于从异步函数返回值。由于地理编码是在Apple的服务器上完成的,因此它是一个异步函数,意味着它不会立即返回,但是执行需要很长时间,因此函数会在执行完成之前返回。另一方面,只有在执行完成后才会调用完成处理程序。
[DiaLaboral
[idDia=1,
nombreDia=Lunes,
configuracionAgenda=<null>,
rangosHorario=<null>,
id=<null>,
version=<null>],
DiaLaboral[idDia=2,
nombreDia=Martes,
configuracionAgenda=<null>,
rangosHorario=<null>,
id=<null>,version=<null>],
DiaLaboral[
idDia=3,
nombreDia=Miércoles,
configuracionAgenda=<null>,
rangosHorario=<null>,
id=<null>,version=<null>]
]