La définition de l'adresse de la chaîne avec reverseGeocodeLocation: et retour à partir de la méthode
Je suis tenter de localiser un début et de fin d'une chaîne d'adresse, afin que je puisse la stocker dans NSUserDefaults
. Le problème est que la méthode continue à exécuter et ne fixe pas de ma 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");
C'est ce que mon débogueur d'application montre:
commencer
einde
Si par exemple l'adresse de mon emplacement est le suivant : "Mainstreet 32, de la VILLE". Alors ce que je voudrais voir est la suivante:
Commencer
Mainstreet 32, VILLE
Einde
Le problème est que mon code n'est pas d'attendre que mon CLGeocoder
à la fin, donc ma variable returnAddress
n'est pas défini lorsqu'il est retourné, et il est vide.
Personne ne sait comment contourner ce problème?
Vous devez vous connecter pour publier un commentaire.
Parce que
reverseGeocodeLocation
a un achèvement bloc, il est transmis à un autre thread lors de l'exécution atteint - mais de l'exécution sur le thread principal va encore continuer sur la prochaine opération, qui estNSLog(returnAddress)
. À ce stade,returnAddress
n'a pas été encore fixé carreverseGeocodeLocation
était JUSTE remis à l'autre thread.Lorsque l'on travaille avec l'achèvement des blocs, vous devez commencer à penser à travailler de manière asynchrone.
Envisager de laisser
reverseGeocodeLocation
que la dernière opération dans votre méthode, puis en appelant une nouvelle méthode avec le reste de la logique à l'intérieur de la fin du bloc. Cela permettra d'assurer que la logique n'a pas d'exécuter jusqu'à ce que vous avez une valeur pourreturnAddress
.Ou vous pouvez utiliser NSNotificationCenter envoyer une notification lorsque
reverseGeocodeLocation
est terminée. Vous pouvez vous abonner à ces notifications n'importe où ailleurs vous en avez besoin, et de compléter la logique à partir de là. Remplacer[self remainderOfMethodHereWithReturnAddress:returnAddress];
avec:Voici un exemple d'utilisation de NSNotificationCenter.