地理编码调用崩溃

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
  1. 您没有正确设置 destinationPlacemark 的变量,请参阅上面的正确设置
  2. 你的苹果地址是错误的,我在前面加了一个1,你还是得到了一个值
  3. 您强制执行的项目过多,导致如您所见的崩溃。我用 guard 语句替换了你的强制转换以防止那些
  4. 我de-clutttered你成功部分的一些变量来精简代码