在切换到下一个场景swift 3 / xcode之前完成地理编码

时间:2017-08-29 17:45:57

标签: swift

这是一个相当常见的话题,我已经完成了我的研究,但仍然只是试图了解关闭/完成处理程序。

我有一个进入位置的场景。用户点击提交,并且从提交到下一个场景有一个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,任何建议都会很棒。

感谢。

1 个答案:

答案 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>]
]