Set address-string mit reverseGeocodeLocation: und Rückkehr aus der Methode
Ich bin versuchen zu lokalisieren, einen start-und Endpunkt an eine Adresse string, so dass ich speichern Sie es in NSUserDefaults
. Das problem ist, dass das Verfahren weiterhin ausgeführt und nicht meine variable.
NSLog(@"Begin");
__block NSString *returnAddress = @"";
[self.geoCoder reverseGeocodeLocation:self.locManager.location completionHandler:^(NSArray *placemarks, NSError *error) {
if(error){
NSLog(@"%@", [error localizedDescription]);
}
CLPlacemark *placemark = [placemarks lastObject];
startAddressString = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
placemark.subThoroughfare, placemark.thoroughfare,
placemark.postalCode, placemark.locality,
placemark.administrativeArea,
placemark.country];
returnAddress = startAddressString;
//[self.view setUserInteractionEnabled:YES];
}];
NSLog(returnAddress);
NSLog(@"Einde");
Dies ist, was meine Anwendung debugger zeigt:
starten
am Einde
Wenn zum Beispiel die Adresse von mein Standort ist : "Mainstreet 32, STADT". Dann, was ich würde sehen wollen, ist die folgende:
Starten
Hauptstraße 32, STADT
Am Einde
Problem ist, dass mein code nicht warten, für meine CLGeocoder
zu beenden, also meine variable returnAddress
ist nicht festgelegt, wenn es zurückgegeben wird, und es ist leer.
Weiß jemand, wie dies zu umgehen?
InformationsquelleAutor Wesley | 2013-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
reverseGeocodeLocation
hat einen Abschluss block, übergeben an einen anderen thread bei der Ausführung erreicht - aber die Ausführung im Haupt-thread wird noch weiter auf die nächste operation, dieNSLog(returnAddress)
. An dieser StellereturnAddress
wurde noch nicht festgelegt noch nicht, weilreverseGeocodeLocation
wurde GERADE abgegeben aus dem anderen thread.Beim arbeiten mit der Fertigstellung der Blöcke, müssen Sie anfangen, darüber nachzudenken, arbeiten asynchron.
Betrachten lassen
reverseGeocodeLocation
wie die Letzte operation in Ihrer Methode, und rufen dann eine neue Methode mit dem Rest der Logik innerhalb der completion-block. Dadurch wird sichergestellt, dass die Logik nicht ausgeführt, bis Sie haben einen Wert fürreturnAddress
.Oder verwenden Sie NSNotificationCenter um eine Benachrichtigung zu senden, wenn
reverseGeocodeLocation
abgeschlossen ist. Sie können abonnieren Sie diese Benachrichtigungen überall wo Sie es brauchen, und füllen Sie die Logik von dort. Ersetzen[self remainderOfMethodHereWithReturnAddress:returnAddress];
mit:Hier ein Beispiel für die Verwendung NSNotificationCenter.
Ich habe aktualisiert die Antwort mit einigen Möglichkeiten, wie Sie ausführen könnte den Rest Ihrer Logik mit der Rückkehr-Adresse, die Sie brauchen.
Genial, ich habe es herausgefunden jetzt! Danke.
sweeeeet! viel Glück mit dem rest!
InformationsquelleAutor Bio