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() 中的完成处理程序更新列表中的地址