Swift - CLGeocoder reverseGeocodeLocation completionHandler closure
Was ich versuche zu tun ist, übergeben Sie einen CLLocation
um die Funktion getPlacemarkFromLocation
die dann anhand der übergebenen CLLocation
durch reverseGeocodeLocation
um die CLPlacemark?
zurückgegeben werden.
Habe ich Probleme, erstellen die completionHandler
Schließung in reverseGeocodeLocation
, es wirft ein compiler-Fehler/Absturz:
In Swift CLGeocodeCompletionHandler
ist CLGeocodeCompletionHandler = (AnyObject[]!, NSError!) -> Void
gemäß der Dokumentation AnyObject[]!
enthalten soll CLPlacemark
Objekte ebenso wie die Objective-C version.
Hier ist meine aktuelle code:
class func getPlacemarkFromLocation(location:CLLocation)->CLPlacemark?{
var g = CLGeocoder()
var p:CLPlacemark?
g.reverseGeocodeLocation(location, completionHandler: {
(placemarks, error) in
let pm = placemarks as? CLPlacemark[]
if (pm && pm?.count > 0){
p = placemarks[0] as? CLPlacemark
}
})
return p?
}
EDIT: wie Es scheint der Fehler zu tun hatte mit placemarks.count
mit placemarks
nicht behandelt werden wie ein array. Es kompiliert jetzt, aber ich bekomme nichts, aber null, wenn die versuchen p
innerhalb der completionHandler
. Ich habe die CLLocation
s übergeben und Sie sind gültig.
EDIT 2: Nach dem drucken placemarks
ich kann bestätigen, dass es die Daten liefert. Allerdings p
noch ist die Rückgabe nil.
InformationsquelleAutor der Frage AaronDancer | 2014-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Antwort, die ich brauchte in diesem thread: Set address-string mit reverseGeocodeLocation: und Rückkehr aus der Methode
Das Problem liegt bei der Tatsache, dass
reverseGeocodeLocation
asynchron ist, ist die Methode gibt einen Wert zurück, bevor die completionBlock setztp
in meinem Beispiel.Wie gewünscht, hier ist mein Aktueller code.
Wollte ich nicht nehmen, das NSNotificationCenter route, denn das würde unnötigen Aufwand verursachen, sondern innerhalb der
completionHandler
Schließung rufe ich eine andere Funktion auf und übergeben dieCLPlacemark
generiertgetPlacemarkFromLocation
als parameter, um die Dinge asynchron, da die Funktion aufgerufen wird, werden nachplacemarks
ist die Funktion (sollte) erhalten die Ortsmarkierung benötigt, und führen Sie den code, den Sie möchten. Hoffe was ich gesagt habe, Sinn macht.InformationsquelleAutor der Antwort AaronDancer
Mit diesen Zeilen von Swift ist, können Sie drucken Sie voll ist die location-Adresse:
Prost!
InformationsquelleAutor der Antwort Goon Nguyen
Hier ist der Verschluss, der für mich gearbeitet -- es dauerte eine Weile, um es zu arbeiten. Ich denke, dass Ihr problem nicht initialisieren p mit der richtigen Initialisierung. Ich habe versucht, ein paar Variationen aus, bis ich diese Arbeit: selbst.Ortsmarke = CLPlacemark(Ortsmarke: stuff[0] als CLPlacemark)
EDIT:
verschoben bessere Antwort auf seine eigene Antwort.
InformationsquelleAutor der Antwort JohnInSea
EDIT: Das funktioniert nicht. Der Wert null außerhalb des Verschluss-siehe Kommentare unten
Ihre p ist null, weil die Schließung einfängt, bevor es initialisiert wird, um eine Referenz. Um das Verhalten, das Sie möchten, müssen Sie p ein nicht-optionaler Wert wie var p : CLPlacemark!.
Unten ist der code, den ich verwendet, um zu testen, meine Vermutung:
Hier ist die Konsole:
Pushit <- Taste gedrückt, um die start-Position erfassen
Außerhalb von dem, was in p: leer
Innen was ist im p: United States
Außerhalb von dem, was in p: leer
Innen was ist im p: United States
Außerhalb von dem, was in p: leer...
InformationsquelleAutor der Antwort JohnInSea
Bisschen spät zu dieser party, aber es sieht aus wie Sie benötigen(ed), etwas Boden-up Lesen über async Zeug. Sie sagen, die, Sie haben wahrscheinlich gelernt, es jetzt.
Ist das grundlegende problem mit deinem code ist, dass p (Ortsmarkierung) gesetzt wird, nachdem die Funktion, so ist es nur verloren - Sie kann nicht eine Funktion verwenden, um einen Wert zurückzugeben, mit async. Mit einem Abschluss-Verschluss, Ihren code übergeben wird, werden die Ortsmarkierung wenn es ankommt (asynchron) & der Verschluss ist aufgerufen, - Hinweis: die Funktion kehrt jetzt zurück nichts.
Verwenden -
Habe ich eigentlich nicht, das in Xcode, aber es sieht Recht...
InformationsquelleAutor der Antwort SomaMan
Dein Zeug funktioniert nicht für eine Reihe von Gründen. Hier ist der Teil, den ich behoben, ohne tatsächlich Blick auf die Funktionalität:
InformationsquelleAutor der Antwort Ryan Dines