地理编码调用崩溃
Crash in Geocode call
在使用 CLGeocoder 时,我在关闭成功部分的 let placemark ... 之后遇到了崩溃 (EXC_BAD_ACCESS),我不明白。我正在测试,可能已经多次尝试访问服务器。或者我需要在后台线程中进行调用吗?
import UIKit
import CoreLocation
class ViewController: UIViewController {
var destinationPlacemark = CLPlacemark()
override func viewDidLoad() {
super.viewDidLoad()
forwardGeocoding(address: "Infinite Loop, Cupertino, CA 95014")
}
func forwardGeocoding(address: String) {
CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
if error != nil {
print(error ?? "Error in plscement conversion")
return
}
if (placemarks?.count)! > 0 {
let placemark = placemarks?[0]
let location = self.destinationPlacemark.location
let coordinate = location?.coordinate
print("Latitude: \(coordinate!.latitude), Longitude: \(coordinate!.longitude)")
self.destinationPlacemark = placemark!
}
})
}
}
*更新原因 *
你在这里有很多东西,所以我会尝试逐步完成我为修复它所做的更改:
首先,为什么会崩溃:
您使用以下命令创建您的目的地地标:
var destinationPlacemark = CLPlacemark()
所以当它运行时:
let location = self.destinationPlacemark.location
它是 运行 针对不包含位置数据的空地标。通过从 guard 语句中创建的检索地标中提取位置,可以避免此问题。
接下来,工作代码:
import UIKit
import CoreLocation
class ViewController: UIViewController {
var destinationPlacemark: CLPlacemark?
override func viewDidLoad() {
super.viewDidLoad()
forwardGeocoding(address: "1 Infinite Loop, Cupertino, CA 95014")
}
func forwardGeocoding(address: String) {
CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
if error != nil {
print(error ?? "Error in pla conversion")
return
}
guard let placemark = placemarks?.first, let coordinate = placemark.location?.coordinate else { return }
print("Latitude: \(coordinate.latitude), Longitude: \(coordinate.longitude)")
self.destinationPlacemark = placemark
})
}
}
产生:
Latitude: 37.3316941, Longitude: -122.030127
- 您没有正确设置
destinationPlacemark
的变量,请参阅上面的正确设置
- 你的苹果地址是错误的,我在前面加了一个1,你还是得到了一个值
- 您强制执行的项目过多,导致如您所见的崩溃。我用 guard 语句替换了你的强制转换以防止那些
- 我de-clutttered你成功部分的一些变量来精简代码
在使用 CLGeocoder 时,我在关闭成功部分的 let placemark ... 之后遇到了崩溃 (EXC_BAD_ACCESS),我不明白。我正在测试,可能已经多次尝试访问服务器。或者我需要在后台线程中进行调用吗?
import UIKit
import CoreLocation
class ViewController: UIViewController {
var destinationPlacemark = CLPlacemark()
override func viewDidLoad() {
super.viewDidLoad()
forwardGeocoding(address: "Infinite Loop, Cupertino, CA 95014")
}
func forwardGeocoding(address: String) {
CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
if error != nil {
print(error ?? "Error in plscement conversion")
return
}
if (placemarks?.count)! > 0 {
let placemark = placemarks?[0]
let location = self.destinationPlacemark.location
let coordinate = location?.coordinate
print("Latitude: \(coordinate!.latitude), Longitude: \(coordinate!.longitude)")
self.destinationPlacemark = placemark!
}
})
}
}
*更新原因 *
你在这里有很多东西,所以我会尝试逐步完成我为修复它所做的更改:
首先,为什么会崩溃:
您使用以下命令创建您的目的地地标:
var destinationPlacemark = CLPlacemark()
所以当它运行时:
let location = self.destinationPlacemark.location
它是 运行 针对不包含位置数据的空地标。通过从 guard 语句中创建的检索地标中提取位置,可以避免此问题。
接下来,工作代码:
import UIKit
import CoreLocation
class ViewController: UIViewController {
var destinationPlacemark: CLPlacemark?
override func viewDidLoad() {
super.viewDidLoad()
forwardGeocoding(address: "1 Infinite Loop, Cupertino, CA 95014")
}
func forwardGeocoding(address: String) {
CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
if error != nil {
print(error ?? "Error in pla conversion")
return
}
guard let placemark = placemarks?.first, let coordinate = placemark.location?.coordinate else { return }
print("Latitude: \(coordinate.latitude), Longitude: \(coordinate.longitude)")
self.destinationPlacemark = placemark
})
}
}
产生:
Latitude: 37.3316941, Longitude: -122.030127
- 您没有正确设置
destinationPlacemark
的变量,请参阅上面的正确设置 - 你的苹果地址是错误的,我在前面加了一个1,你还是得到了一个值
- 您强制执行的项目过多,导致如您所见的崩溃。我用 guard 语句替换了你的强制转换以防止那些
- 我de-clutttered你成功部分的一些变量来精简代码