2016-10-10 4 views
1

Das ist mein CodeSwift 3: reverseGeocodeLocation nicht seinen Abschluss Handler

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) 
    } 
} 

Die Ausführung dieses Code-Snippet ist in meiner app rechts geht, traten keine Laufzeitfehler.

jedoch die letzte Zeile, die aufgerufen wird, ist

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

ich auch doppelt geprüft, dass loca nicht gleich Null ist.

Warum wird der Beendigungshandler nicht aufgerufen?

+0

Wo ist geoCoder definiert? Ist es ein Mitglied Ihres View-Controllers? – xpereta

Antwort

3

Verwenden Sie completionHandler in Schließung.

prüfen unten Beispiel:

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: "") 
      } 

     }) 
+3

Wie ist das eine Antwort? Der Code in der Frage hatte einen Beendigungshandler. – xpereta

+4

Beachten Sie, dass sich der Beendigungshandler im Fragencode befindet, nur in der abschließenden Abschlusssyntax. Die 2 Formen sind korrekt. – xpereta

+2

aus irgendeinem Grund funktioniert der Code von @Kampai, während meins nicht funktioniert. Ich habe diese Antwort akzeptiert, aber es wäre schön zu wissen, was mit meiner Herangehensweise nicht stimmt - vielleicht ist es etwas mit swift 3 – DCDC

0

ich auf diese Frage kam, und es scheint, als gäbe es einige Verwirrung in Bezug auf die Antwort war. Hier ist die umfassende Möglichkeit, Standortinformationen mit Swift 3 zu erhalten, nur für zukünftige Leser, die auf diese Frage stoßen.

Dieser Funktionscode verwendet die didUpdateLocations-Funktion und reverseGeocodeLocation(), um den Standort in eine lesbare Adresse umzuwandeln. Außerdem wird die Kartenansicht auf den aktuellen Benutzerstandort festgelegt. Dies setzt natürlich voraus, dass Sie Ihr Standortmanager-Objekt eingerichtet haben.

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) 

} 
Verwandte Themen