Swift 3:reverseGeocodeLocation不会调用其完成处理程序

这是我的代码

if loc.latitude != 0.0 && loc.longitude != 0.0 { let loca = CLLocation(latitude: loc.latitude, longitude: loc.longitude) geoCoder.reverseGeocodeLocation(loca) { (placemarks, error) in // this is the last line that is being called var placemark : CLPlacemark! placemark = placemarks?[0] city = (placemark.addressDictionary?["City"] as! String) } } 

在我的应用程序中执行此代码段是正确的,没有发生运行时错误。

但是,被调用的最后一行是

geoCoder.reverseGeocodeLocation(loca){(placemarks, error)

我还仔细检查过loca不是零。

为什么没有调用完成处理程序?

在Closure中使用completionHandler

检查以下示例:

 geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in // Place details var placeMark: CLPlacemark! placeMark = placemarks?[0] // Address dictionary print(placeMark.addressDictionary, terminator: "") // Location name if let locationName = placeMark.addressDictionary!["Name"] as? NSString { print(locationName, terminator: "") } // Street address if let street = placeMark.addressDictionary!["Thoroughfare"] as? NSString { print(street, terminator: "") } // City if let city = placeMark.addressDictionary!["City"] as? NSString { print(city, terminator: "") } // Zip code if let zip = placeMark.addressDictionary!["ZIP"] as? NSString { print(zip, terminator: "") } // Country if let country = placeMark.addressDictionary!["Country"] as? NSString { print(country, terminator: "") } }) 

我遇到了这个问题,似乎对答案有些疑惑。 以下是使用Swift 3获取位置信息的广泛方式,适用于遇到此问题的任何未来读者。

此函数代码使用didUpdateLocations函数和reverseGeocodeLocation()将位置转换为人类可读的地址。 它还将地图视图设置为当前用户位置。 这当然是假设您已经设置了您的位置管理器对象。

 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // Get first location item returned from locations array let userLocation = locations[0] // Convert location into object with human readable address components CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in // Check for errors if error != nil { print(error ?? "Unknown Error") } else { // Get the first placemark from the placemarks array. // This is your address object if let placemark = placemarks?[0] { // Create an empty string for street address var streetAddress = "" // Check that values aren't nil, then add them to empty string // "subThoroughfare" is building number, "thoroughfare" is street if placemark.subThoroughfare != nil && placemark.thoroughfare != nil { streetAddress = placemark.subThoroughfare! + " " + placemark.thoroughfare! } else { print("Unable to find street address") } // Same as above, but for city var city = "" // locality gives you the city name if placemark.locality != nil { city = placemark.locality! } else { print("Unable to find city") } // Do the same for state var state = "" // administrativeArea gives you the state if placemark.administrativeArea != nil { state = placemark.administrativeArea! } else { print("Unable to find state") } // And finally the postal code (zip code) var zip = "" if placemark.postalCode != nil { zip = placemark.postalCode! } else { print("Unable to find zip") } print("\(streetAddress)\n\(city), \(state) \(zip)") } } } // Create a coordinate based on users location latitude and longitude let coordinate = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude) // Set the span (zoom) of the map view. Smaller number zooms in closer let span = MKCoordinateSpan(latitudeDelta: 0.001, longitudeDelta: 0.001) // Set the region, using your coordinates & span objects let region = MKCoordinateRegion(center: coordinate, span: span) // Set your map object's region to the region you just defined map.setRegion(region, animated: true) }