Question

I have a problem with CLGeocoder, if I try to gain the address name using CLGeocoder and the user current coordinates it correctly returns the address name, postal code, state, etc. in the NSLog but if I try to send those informations in a NSString [contained in a NSMutableArray, but I don't think this is the problem] it returns a (null) value. I suspect this problem is caused by the block I have used in the code, but I am not sure, and I don't know how to fix this problem anyway.

Here's my code:

- (NSArray *)dataArrayPosizione
{
    if (self.arrayPosizione == nil)
    {

        reverseGeocoder = [[CLGeocoder alloc] init];

        locationToReverseGeocode = [[CLLocation alloc]initWithLatitude:self.mapView.userLocation.location.coordinate.latitude longitude:self.mapView.userLocation.location.coordinate.longitude];

        [reverseGeocoder reverseGeocodeLocation:locationToReverseGeocode completionHandler:^(NSArray *placemarks, NSError *error)
        {
            if (placemarks && placemarks.count > 0)
            {
                placemark = placemarks[0];

                NSLog(@"\n%@ %@\n%@, %@, %@\n%@", [placemark subThoroughfare],[placemark thoroughfare], [placemark locality], [placemark administrativeArea], [placemark postalCode], [placemark country]);
            }
        }];

        informazioniPosizione = [NSMutableArray new];

        [informazioniPosizione addObject:[NSString stringWithFormat:@"Indirizzo: %@", [placemark country]]];
        [informazioniPosizione addObject:[NSString stringWithFormat:@"Latitudine: %g\u00B0\nLongitudine: %g\u00B0", self.mapView.userLocation.location.coordinate.latitude, self.mapView.userLocation.location.coordinate.longitude]];

        self.arrayPosizione = informazioniPosizione;
    }

    return self.arrayPosizione;
}

And a picture: enter image description here

Can someone please help me with this? If the posted code is not enough for you to understand the problem I will paste more lines.

Thanks

Was it helpful?

Solution

You are creating your string before the geocoding block executes. It should look like this:

- (NSArray *)dataArrayPosizione
{
    if (self.arrayPosizione == nil)
    {

        reverseGeocoder = [[CLGeocoder alloc] init];

        locationToReverseGeocode = [[CLLocation alloc]initWithLatitude:self.mapView.userLocation.location.coordinate.latitude longitude:self.mapView.userLocation.location.coordinate.longitude];

        [reverseGeocoder reverseGeocodeLocation:locationToReverseGeocode completionHandler:^(NSArray *placemarks, NSError *error)
        {
            informazioniPosizione = [NSMutableArray new];

            if (placemarks && placemarks.count > 0)
            {
                placemark = placemarks[0];

                NSLog(@"\n%@ %@\n%@, %@, %@\n%@", [placemark subThoroughfare],[placemark thoroughfare], [placemark locality], [placemark administrativeArea], [placemark postalCode], [placemark country]);

                [informazioniPosizione addObject:[NSString stringWithFormat:@"Indirizzo: %@", [placemark country]]];
                [informazioniPosizione addObject:[NSString stringWithFormat:@"Latitudine: %g\u00B0\nLongitudine: %g\u00B0", self.mapView.userLocation.location.coordinate.latitude, self.mapView.userLocation.location.coordinate.longitude]];

            }

            self.arrayPosizione = informazioniPosizione;

            return self.arrayPosizione;
        }];

    }

}

OTHER TIPS

CLGeocoder's block will get executed asynchronously and therefore the placemark variable is not set yet when you try to use it. Like bachonk suggests, move the code within the geocoder's block. After you add the placemark's info to the array you simply have to call -[UITableView reloadData] on your tableView and the info will appear.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top