geocodeAddressString 不能快速工作

Posted

技术标签:

【中文标题】geocodeAddressString 不能快速工作【英文标题】:geocodeAddressString not working for swift 【发布时间】:2017-07-14 03:47:25 【问题描述】:

您好,我正在尝试使用 geocodeAddressString 将地址转换为地图上的地标,但是无论我传递给此方法的地址如何,下面的块都将永远不会执行,谁能给我一些启示?非常感谢 顺便说一句,concole上可以看到“before”和“after”,但是没有“hello”

  let geo = CLGeocoder()
    print("before")
    geo.geocodeAddressString(("4 Bradford St, Perth WA 6050"), completionHandler: 
        (placemarks, error) -> Void in

        print ("hello")
        if let placemark = placemarks?[0]
       
          self.mapView.addAnnotation(MKPlacemark(placemark: placemark))
        
    )

  print ("after")

【问题讨论】:

所以,你从来没有看到“你好”?你确定你会到达geocodeAddressString这一行吗? 是的,我在这个调用之后放了一个print("bye"),就可以打印成功了,好奇怪 您应该创建reproducible example of the problem(即空白项目,除了重现此特定行为之外什么都不做)。我无法重现您的问题。如果我们无法重现问题,我们也无法帮助您解决问题。 顺便说一句,这不是在游乐场或命令行应用程序中,对吧?它在一个实际的ios项目中?什么版本?我在想如果geo 超出范围,您可能会遇到这个问题,但看起来geocodeAddressString 使地理编码器保持活动状态,直到请求完成。即使您在代码的其他地方有一些cancelGeocode() 调用,您至少会看到“hello”消息。 只是想根据最近的一些个人经验来插话,您可能会在不同国家/地区为相同的输入获得不同的结果。这是因为在没有 region 输入参数的情况下调用它会使用设备位置来通知结果。此外,它为您提供的东西似乎有一些最大的距离。例如:在印度输入“55101”(美国邮政编码)不会提供任何结果,而在美国则提供预期结果。我还没有找到解决方法,所以这样看来,这个API似乎不如google的同等服务。 【参考方案1】:

使用这个

import CoreLocation

let address = "1 Infinite Loop, CA, USA"
let geocoder = CLGeocoder()

geocoder.geocodeAddressString(address, completionHandler: (placemarks, error) -> Void in
   if((error) != nil)
      print("Error", error)
   
   if let placemark = placemarks?.first 
      let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
      
    )

【讨论】:

【参考方案2】:

试试这个代码:

geocoder.geocodeAddressString(("4 Bradford St, Perth WA 6050"), completionHandler: (placemarks, error) -> Void in

                    if let placemark = placemarks?.first 
                        let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
                        coordinates.latitude
                        coordinates.longitude


                        self.lat = coordinates.latitude
                        self.long = coordinates.longitude
                        print("lat \(self.lat)")
                        print("long \(self.long)")
                    
                )

【讨论】:

还是没有结果回来:( 好的!您可以发送您的示例输出吗?【参考方案3】:

使用这个

    import CoreLocation

    let address = "4 Bradford St, Perth WA 6050"
    let geocoder = CLGeocoder()

    geocoder.geocodeAddressString(address, completionHandler: (placemarks, error) -> Void in
       if((error) != nil)
          print("Error", error)
       
       if let placemark = placemarks?.first 
          let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
          
        )


var address = "4 Bradford St, Perth WA 6050"
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(address, (placemarks: [AnyObject]!, error: NSError!) -> Void in
    if let placemark = placemarks?[0] as? CLPlacemark 
        self.mapView.addAnnotation(MKPlacemark(placemark: placemark))
    
)

【讨论】:

以上是关于geocodeAddressString 不能快速工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .geocodeAddressString 不会更改外部变量?

网点更名?破坏 geocodeAddressString()?

来自 geocodeAddressString 的无法识别的选择器错误处理结果

如何从 CLGeocoder geocodeAddressString() 中的完成处理程序更新列表中的地址

测试 CLGeocoder geocodeAddressString 方法地标始终为零

按最近位置排序 CLGeoCoder geocodeAddressString 的结果